洛谷 1071 潜伏者(NOIp2009提高组)
【题意概述】
给出三行字符串,前两行代表密码与明文的对应关系,第三行为待翻译的文本。要求按照对应关系翻译文本。
【题解】
直接模拟即可。 注意判断Failed的情况。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define LL long long 5 #define rg register 6 #define N 200010 7 using namespace std; 8 int n,m,a[26],b[26]; 9 char s1[N],s2[N],c[N],ans[N]; 10 int main(){ 11 memset(a,-1,sizeof(a)); 12 memset(b,-1,sizeof(b)); 13 scanf("%s%s%s",s1,s2,c); 14 m=strlen(s1); n=strlen(c); 15 for(rg int i=0;i<m;i++) 16 if(a[s1[i]-'A']==-1&&b[s2[i]-'A']==-1) a[s1[i]-'A']=s2[i]-'A',b[s2[i]-'A']=s1[i]-'A'; 17 else 18 if(a[s1[i]-'A']!=s2[i]-'A'||b[s2[i]-'A']!=s1[i]-'A'){ 19 puts("Failed"); return 0; 20 } 21 for(rg int i=0;i<26;i++)if(a[i]==-1){ 22 puts("Failed"); return 0; 23 } 24 for(rg int i=0;i<n;i++) 25 if(a[c[i]-'A']!=-1) ans[i]=(char)(a[c[i]-'A']+'A'); 26 else{ 27 puts("Failed"); return 0; 28 } 29 for(rg int i=0;i<n;i++) printf("%c",ans[i]); 30 puts(""); 31 return 0; 32 }