1001 Clairewd’s message
题目大意:第一行输入字母加密规则,第二行输入一个串a以及加密后的a’组成了一个串a’a。但是这个串残缺了一部分内容(a的部分残缺了),只剩下了s=a’b(b是a的一个前缀或者空串)
让求出最短的a。
1 #include <map>
2 #include <cstdio>
3 #include <cstring>
4 #include <iostream>
5 const int maxn=100001;
6 using namespace std;
7 int main()
8 {
9 char s[27],s1[maxn];
10 int l1,t,i,j,k,n,flag,l;
11 scanf("%d%*c",&t);
12 while(t--)
13 {
14 map<char,char>a;
15 gets(s);
16 for(i=0;i<26;i++)
17 a[s[i]]=i+'a';
18 gets(s1);
19 l1=strlen(s1);
20 if(l1&1)
21 k=l1/2+1;
22 else
23 k=l1/2;
24 l=l1;
25 for(i=k;i<l1;i++)
26 {
27 flag=0;
28 for(j=i;j<l1;j++)
29 {
30 if(a[s1[j-i]]!=s1[j])
31 {
32 flag=1;
33 break;
34 }
35 }
36 if(!flag)
37 {
38 l=i;
39 break;
40 }
41 }
42 if((l1&1==0)&&l==(l1/2))
43 puts(s1);
44 else
45 {
46 j=0;
47 printf("%s",s1);
48 for(i=l1-l;i<l;i++)
49 printf("%c",a[s1[i]]);
50 puts("");
51 }
52 }
53 return 0;
54
2 #include <cstdio>
3 #include <cstring>
4 #include <iostream>
5 const int maxn=100001;
6 using namespace std;
7 int main()
8 {
9 char s[27],s1[maxn];
10 int l1,t,i,j,k,n,flag,l;
11 scanf("%d%*c",&t);
12 while(t--)
13 {
14 map<char,char>a;
15 gets(s);
16 for(i=0;i<26;i++)
17 a[s[i]]=i+'a';
18 gets(s1);
19 l1=strlen(s1);
20 if(l1&1)
21 k=l1/2+1;
22 else
23 k=l1/2;
24 l=l1;
25 for(i=k;i<l1;i++)
26 {
27 flag=0;
28 for(j=i;j<l1;j++)
29 {
30 if(a[s1[j-i]]!=s1[j])
31 {
32 flag=1;
33 break;
34 }
35 }
36 if(!flag)
37 {
38 l=i;
39 break;
40 }
41 }
42 if((l1&1==0)&&l==(l1/2))
43 puts(s1);
44 else
45 {
46 j=0;
47 printf("%s",s1);
48 for(i=l1-l;i<l;i++)
49 printf("%c",a[s1[i]]);
50 puts("");
51 }
52 }
53 return 0;
54