标签:stl codeforces
题意:已知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; } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:stl codeforces
原文地址:http://blog.csdn.net/ac_0_summer/article/details/47630565