码迷,mamicode.com
首页 > 其他好文 > 详细

Vijos p1449 字符串还原

时间:2018-02-26 20:32:21      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:lag   数据   targe   题目   include   问题   tar   ++   相关   

背景
小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 }

 

Vijos p1449 字符串还原

标签:lag   数据   targe   题目   include   问题   tar   ++   相关   

原文地址:https://www.cnblogs.com/yachen2018/p/8475413.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!