背景
小K是一位蔚蓝教主的崇拜者(Orz教主er),有一天,他收到了一封匿名信,信告诉了小K由于他表现出色,得到了一次当面Orz教主的机会,但是要当面Orz教主可不那么容易,不是每个人都有资格Orz教主的。所以要破解下面一段密文才可以得到相关的信息,信中有提供加密的规则,但是小K觉得这个问题看似复杂,所以想请你帮忙。
描述
一个长度为n的由小写字母组成的字符串s1,s2,...,sn按如下方式加密成3种形式:
1、将字符串翻转,即对于每一个1<=i<=n来说,si与s(n-i+1)对换。
2、将字符串中每个字母变为其之后第k个字母,定义z之后的字母为a,其中0≤k≤6且为未知数。
3、将字符串中每个字母变为其之前第k个字母,定义a之前的字母为z,k同2所述。
例如字符串abcd按上面3种方式加密后,在k=1k=1的情况下会依次变为:
1、dcba;
2、bcde;
3、zabc。
现给出信中按以上3种形式分别加密后的3个字符串(不一定按上述例子的顺序),要求还原原来的字符串,并输出告诉小K。
格式
输入格式
输入的第1行为一个整数n,表示这个字符串的长度。
下面3行每行1个长度为n的字符串,且保证符合题目要求。
输出格式
输出仅包括1行,为还原后的字符串。
样例输入
4
zabc
dcba
bcde
样例输出
abcd
限制
对于10%的数据,输入给出加密字符串的顺序同题目中1、2、3的顺序。
对于20%的数据,n≤5;
对于40%的数据,n≤10;
对于60%的数据,n≤255;
对于100%的数据,n≤10000。
时限
1s
思路
一个一个假定为逆序,倒转过来再去判定其他两个是否符合条件
代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int strrev(char *); 6 int strtransform(char *,int); 7 8 int main() { 9 int n,i,j,k,t; 10 int flag; 11 char s[3][10010],tmp[10010],tmp2[10010],tmp3[10010]; 12 flag=0; 13 scanf ("%d",&n); 14 scanf ("%s%s%s",s[0],s[1],s[2]); 15 for (i=0;i<3;i++) { 16 strcpy(tmp,s[i]); 17 strrev(tmp); 18 for (k=0;k<=6;k++) { 19 for (j=0;j<3;j++) { 20 if (j==i) continue; 21 if (i==0 && j==1) t=2; 22 else if (i==0 && j==2) t=1; 23 else if (i==1 && j==0) t=2; 24 else if (i==1 && j==2) t=0; 25 else if (i==2 && j==0) t=1; 26 else if (i==2 && j==1) t=0; 27 strcpy(tmp2,s[j]); 28 strtransform(tmp2,k); 29 strcpy(tmp3,s[t]); 30 strtransform(tmp3,-k); 31 if (strcmp(tmp,tmp2)==0 && strcmp(tmp,tmp3)==0) { 32 flag=1; 33 break; 34 } 35 } 36 if (flag) break; 37 } 38 if (flag) break; 39 } 40 if (flag) puts(tmp); 41 system("pause"); 42 return 0; 43 } 44 45 int strrev(char *s) { 46 int len=strlen(s); 47 int half=len/2; 48 int i,target; 49 for (i=0;i<half;i++) { 50 target=len-i-1; 51 char tmp=s[i]; 52 s[i]=s[target]; 53 s[target]=tmp; 54 } 55 return 0; 56 } 57 58 int strtransform(char *s,int k) { 59 int len=strlen(s); 60 int i; 61 for (i=0;i<len;i++) { 62 if (k>0 && s[i]+k>‘z‘) s[i]=s[i]-26+k; 63 else if (k<0 && s[i]+k<‘a‘) s[i]=s[i]+26+k; 64 else s[i]+=k; 65 } 66 return 0; 67 }