天天看點

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++提供的排序函數。