题意:每组3个串,前两个串长度为n,第三个串长度为2*n,依次从第二个串(s2)中取一个字符,从第一个串(s1)中取一个字符,......,直至取完,如果组成的新串(s)和第三个字符串相同则输出组数和匹配成功的次数,如果不相同,则将s串的前n个字符作为s1,后n个字符作为s2,接着匹配,如果永远匹配不成s,则输出组数和-1。
思路:简单的字符串模拟,关键是判断输出-1的情况,如果一直匹配与 s不同,但与原来的strcat(s1,s2)相同,则证明无法匹配成功,因为此时字符串已经匹配了一个周期。
1 #include2 #include 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 else33 {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 }