天天看点

POJ2159

解出了第一道题,keep fighting!

POJ2159:http://poj.org/problem?id=2159

这是一道和加密有关的题目,采用的是简单的替换和排列的加密方法。

判断一串字符是否是另外一串字符采用某种加密方式产生的加密字符。

如果已知加密的具体方式,程序编写简单,若去求解之间的加密关系,将会比较复杂。

考虑到替换和排列的加密方式。对应字母出现的频率是一致的,若以统计频率的方式作为判断依据,将会很简单。

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int a[26]={0};
    int b[26]={0};
    int ntmp;
    int i=0;
    char origin[101],encrypt[101];

    while(cin>>encrypt>>origin){
        while((ntmp = encrypt[i++] - 'A') >= 0 && ntmp < 26)
            a[ntmp]++;
        i=0;
        while((ntmp = origin[i++] - 'A') >= 0 && ntmp < 26)
            b[ntmp]++;
        //sort
        sort(a, a+26);
        sort(b, b+26);
        // compare and judge
        for(i=0; i<26; i++){
            if(a[i] != b[i]){
                break;
            }
        }
        if(i == 26)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;

    }
    return 0;
}
           

总结:

好的思路会产生更方便有效的结果;

时间上的优化可以自己编写更有效的排序代码,这里选用的C++提供的排序函数。