uvaoj1339 - Ancient Cipher(思维题,排序,字符串加密)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4085
两个字符串,判断能否把其中一个字符串重排,然后对每个字母进行映射(比如映射到前一个字母),使得两个字符串相同
这里要转一个弯,既然字母可以重排,那么每个字母最初的顺序并不重要,重要的是每个字母出现的次数,所以只要分别用数组保存每个字母出现的次数,在把这个数组从小到大排序,如果最后两个数组相同,那么这个问题的结果就是YES(可以使两个字符串相同)、
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s1[105],s2[105]; 4 int a[26],b[26]; 5 int main() 6 { 7 while(~scanf("%s %s",s1,s2)) 8 { 9 10 memset(a,0,sizeof(a)); 11 memset(b,0,sizeof(b)); 12 for(int i=0; i<strlen(s1); i++) 13 { 14 a[s1[i]-'A']++; 15 } 16 for(int i=0; i<strlen(s2); i++) 17 { 18 b[s2[i]-'A']++; 19 } 20 sort(a,a+26); 21 sort(b,b+26); 22 int ans=1; 23 for(int i=0; i<26; i++) 24 { 25 if(a[i]!=b[i]) 26 { 27 ans=0; 28 break; 29 } 30 } 31 if(ans)printf("YES\n"); 32 else printf("NO\n"); 33 memset(s1,'\0',sizeof(s1)); 34 memset(s2,'\0',sizeof(s2)); 35 } 36 37 return 0; 38 }