P1449 字符串还原
背景
小K是一位蔚蓝教主的崇拜者(Orz教主er),有一天,他收到了一封匿名信,信告诉了小K由于他表现出色,得到了一次当面Orz教主的机会,但是要当面Orz教主可不那么容易,不是每个人都有资格Orz教主的。所以要破解下面一段密文才可以得到相关的信息,信中有提供加密的规则,但是小K觉得这个问题看似复杂,所以想请你帮忙。
描述
一个长度为n的由小写字母组成的字符串
s1s2s3…sn
s
1
s
2
s
3
…
s
n
按如下方式加密成3种形式:
1、将字符串翻转,即对于每一个
1≤i≤n
1
≤
i
≤
n
来说,
si
s
i
与
sn−i+1
s
n
−
i
+
1
对换。
2、将字符串中每个字母变为其之后第k个字母,定义z之后的字母为a,其中0≤k≤6且为未知数。
3、将字符串中每个字母变为其之前第k个字母,定义a之前的字母为z,k同2所述。
例如字符串abcd按上面3种方式加密后,在k=1的情况下会依次变为:
1、dcba;
2、bcde;
3、zabc。
现给出信中按以上3种形式分别加密后的3个字符串(不一定按上述例子的顺序),要求还原原来的字符串,并输出告诉小K。
格式
输入格式
输入的第1行为一个整数n,表示这个字符串的长度。
下面3行每行1个长度为n的字符串,且保证符合题目要求。
输出格式
输出仅包括1行,为还原后的字符串。
样例1
样例输入1
4
zabc
dcba
bcde
Copy
样例输出1
abcd
限制
对于10%的数据,输入给出加密字符串的顺序同题目中1、2、3的顺序。
对于20%的数据,n≤5;
对于40%的数据,n≤10;
对于60%的数据,n≤255;
对于100%的数据,n≤10000。
时限1s
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n;
int match(char* s1,char* s2,char* s3)
{
//S1为颠倒,S2为加K所得,S3为减K所得
char *tem1,*tem2,*tem3;
int i,k;
tem1=(char*)malloc(n*sizeof(char));
tem2=(char*)malloc(n*sizeof(char));
tem3=(char*)malloc(n*sizeof(char));
//cope with s1
for(i=0;i<n;i++)
{
*(tem1+i)=*(s1+n-1-i);
}
for(k=0;k<=6;k++)
{
for(i=0;i<n;i++)
{
*(tem2+i)=(*(s2+i)-97-k+26)%26+97;
*(tem3+i)=(*(s3+i)-97+k)%26+97;
}
if(strcmp(tem1,tem2)==0&&strcmp(tem1, tem3)==0)
{
printf("%s\n",tem1);
return 1;
}
}
return 0;
}
int main()
{
char *str1,*str2,*str3;
scanf("%d",&n);
str1=(char*)malloc(n*sizeof(char));
str2=(char*)malloc(n*sizeof(char));
str3=(char*)malloc(n*sizeof(char));
scanf("%s\n%s\n%s",str1,str2,str3);
if(match(str1, str2, str3)==0)
{
if(match(str1,str3,str2)==0)
{
if(match(str2, str1, str3)==0)
{
if(match(str2, str3, str1)==0)
{
if(match(str3, str1, str2)==0)
{
match(str3,str2,str1);
}
}
}
}
}
return 0;
}
注意事项
无,题目非常简单