http://poj.org/problem?id=3087
题意:每组3个串,前两个串长度为n,第三个串长度为2*n,依次从第二个串(s2)中取一个字符,从第一个串(s1)中取一个字符,......,直至取完,如果组成的新串(s)和第三个字符串相同则输出组数和匹配成功的次数,如果不相同,则将s串的前n个字符作为s1,后n个字符作为s2,接着匹配,如果永远匹配不成s,则输出组数和-1。
思路:简单的字符串模拟,关键是判断输出-1的情况,如果一直匹配与 s不同,但与原来的strcat(s1,s2)相同,则证明无法匹配成功,因为此时字符串已经匹配了一个周期。
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char s1[520],s2[520],s[1010],str[520],ss[520]; 6 int t,n,o = 0; 7 scanf("%d",&t); 8 while(t--) 9 { 10 o++; 11 int k ,cnt = 0; 12 scanf("%d",&n); 13 scanf("%s%s",s1,s2); 14 strcpy(ss,s1); 15 strcat(ss,s2); 16 scanf("%s",str); 17 while(1) 18 { 19 cnt++; 20 k = 0; 21 for (int i = 0; i < n; i ++) 22 { 23 s[k++] = s2[i]; 24 s[k++] = s1[i]; 25 } 26 s[k] ='\0'; 27 if (!strcmp(s,str)) 28 { 29 printf("%d %d\n",o,cnt); 30 break; 31 } 32 else 33 { 34 int i,j = 0; 35 for (i = 0; i < n; i ++) 36 s1[i] = s[i]; 37 for ( ; i < 2*n; i ++) 38 s2[j++] = s[i]; 39 s1[i] = '\0'; 40 s2[j] = '\0'; 41 if (!strcmp(s,ss)) 42 { 43 printf("%d -1\n",o); 44 break; 45 } 46 } 47 } 48 49 } 50 return 0; 51 }