hdu 1287 破译密码

时间:2022-09-09 15:33:05

题目链接:点击打开链接



预处理出26个字母互相异或的值,然后搜索。

结果数组要开到10000。


代码:

#include <iostream>
#include <cstdio>

using namespace std;

int Hash[30][30];
char res[10000];
int a[10000];

void init(){
    for(int i='A';i<='Z';i++){
        for(int j='A';j<='Z';j++){
                Hash[i][j]=i^j;
        }
    }
}

int main(){
    init();
    int N;
    while(cin>>N){
        for(int i=1;i<=N;i++){
            scanf("%d",&a[i]);
        }
        int i,j,k;
        for(i='A';i<='Z';i++){
            for(j=1;j<=N;j++){
                for(k='A';k<='Z';k++){
                    if(Hash[i][k]==a[j]){
                        res[j]=char(k);
                        break;
                    }
                }
                if(k>'Z') break;
            }
            if(j>N) break;
        }
        for(i=1;i<=N;i++){
            cout<<res[i];
        }
        cout<<endl;
    }
    return 0;
}