Description
J 君是机房的红太阳,每次模拟她总是 AK 虐场。然而在 NOIP2117 中,居然出现了另一位 AK 的选手 C 君! 这引起了组委会的怀疑,组委会认为 C 君有抄袭 J 君代码的嫌疑,原因是考试时 C 君正好 坐在 J 君旁边。于是组委会需要你帮她们鉴定一下 C 君是否抄了 J 君的代码。 NOIP2117 一共有 T 道题,每道题需要提交一份阿语言代码 (阿语言是 NOIP2117 的唯一可 用编程语言)。 一份阿语言代码只有一行,仅由小写字母,数字,空格和分号组成。 组委会认为,如果 C 君的代码可以由 J 君的代码经过若干次修改变量名操作得到,C 君就 抄了 J 君的代码。 一次修改变量名操作被定义为将代码中的所有小写字母 x 替换为小写字母 y(此处 x, y 代指 任意小写字母)。 请你告诉组委会,对于每道题,C 君是否抄了 J 君的代码。
Input
第一行一个正整数 T。 接下来 2T 行,第 2i 行代表 J 君对于第 i 道题的提交代码,第 2i + 1 行代表 C 君对于第 i 道题的提交代码。
Output
输出 T 行,如果对于第 i 道题,C 君抄了 J 君的代码,请在第 i 行输出1,否则请在第 i 行 输出0。
Sample Input
5 int x; int y; double a; double aa; float 1 float 2 string s; double d; print thisismycode; float tooooooooooo;
Sample Output
1 0 0 1 1
Data Constraint
10% 的数据满足代码中不包含字母。
另外 30% 的数据满足代码中只包含字母。
100% 的数据满足 T ≤ 1000,每行代码中不会包含超过 1000 个字符。
另外 30% 的数据满足代码中只包含字母。
100% 的数据满足 T ≤ 1000,每行代码中不会包含超过 1000 个字符。
题解
- 用一个数组记录第i的字母变成什么,O(n)跑一遍就好了
- 至于,
- abcdefghijklmnopqrstuvwxyz
- zyxwvutsrqponmlkjihgfedcba
- 这种情况,一开始将a变成z,就会有两个z了,就是0
- 我的理解是,每次交换过后就不管了,这样就可以不用管两个z了
- 这叫做充分了解出题人的思想
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 int t,len1,len2; 6 char dy[255]; 7 string s1,s2; 8 bool pd(char x) { return (x>='a'&&x<='z'); } 9 int main() 10 { 11 freopen("copycat.in","r",stdin); 12 freopen("copycat.out","w",stdout); 13 scanf("%d\n",&t); 14 for (;t;t--) 15 { 16 getline(cin,s1);getline(cin,s2); 17 memset(dy,0,sizeof(dy)); 18 len1=s1.length(),len2=s2.length(); 19 if (len1!=len2) 20 { 21 printf("0\n"); 22 continue; 23 } 24 for (int i=0;i<len1;i++) 25 { 26 if ((!pd(s1[i])&&pd(s2[i]))||(pd(s1[i])&&!pd(s2[i]))||(!pd(s1[i])&&!pd(s2[i])&&s1[i]!=s2[i])) 27 { 28 printf("0\n"); 29 break; 30 } 31 else 32 if (pd(s1[i])&&pd(s2[i])) 33 { 34 if (dy[s1[i]]&&dy[s1[i]]!=s2[i]) 35 { 36 printf("0\n"); 37 break; 38 } 39 dy[s1[i]]=s2[i]; 40 } 41 if (i==len1-1) printf("1\n"); 42 } 43 } 44 return 0; 45 }