Gym 100625C 密文匹配

题意:已知n个明文和一个密文,推出可能的匹配关系,然后输出字符串ss的密文。

分析:

一个模拟题,当时想偏了,,还想着要同一字母可能在任意位置,然后要记录每个字母的位置,找密文的相应位置必须是同一字母,balabala的,不知道什么鬼。

其实就是简单的对应关系,不用管位置啥的,只管同一字母对应的密文是一样的就行了。26个字母,枚举一遍就是了。对应关系匹配啥的用map是最好不过的了。小tirck是,如果已知25个字母,那么剩下的一个也就知道了。

代码:

#include<iostream>#include<string>#include<cstring>#include<map>#include<algorithm>using namespace std;int t,n;char a[200][1005],b[1005],c[1005];char ans[200][1005];map<char,char> mp1,mp2;int main(){cin>>t;while(t–){cin>>n;for(int i=0;i<n;i++){cin>>a[i];}cin>>b>>c;int len1=strlen(b);int len2=strlen(c);int ok1[10005];memset(ok1,0,sizeof(ok1));int ok2=0;for(int i=0;i<n;i++){int l=strlen(a[i]);if(l==len1){mp1.clear();mp2.clear();int ok=1,cnt=0;for(int j=0;j<len1;j++){if(mp1[a[i][j]]==0&&mp2[b[j]]==0){mp1[a[i][j]]=b[j];cnt++;mp2[b[j]]=a[i][j];}else if(mp1[a[i][j]]==b[j]&&mp2[b[j]]==a[i][j]) continue;else{ok=0;break;}}if(ok){ok1[i]=1;ok2=1;if(cnt==25){char tmp1,tmp2;for(char j='a';j<='z';j++){if(mp1[j]==0){tmp1=j;break;}}for(char j='a';j<='z';j++){if(mp2[j]==0){tmp2=j;break;}}mp1[tmp1]=tmp2;}for(int j=0;j<len2;j++){if(mp1[c[j]]!=0){ans[i][j]=mp1[c[j]];}else ans[i][j]='?';}}}}if(!ok2){cout<<"IMPOSSIBLE"<<endl;}else{for(int i=0;i<len2;i++){char tmp='#';for(int j=0;j<n;j++){if(ok1[j]){if(tmp=='#') tmp=ans[j][i];else if(tmp!=ans[j][i]){tmp='?';break;}}}cout<<tmp;}cout<<endl;}}}

版权声明:本文为博主原创文章,未经博主允许不得转载。

积极的人在每一次忧患中都看到一个机会,

Gym 100625C 密文匹配

相关文章:

你感兴趣的文章:

标签云: