- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
有两个由字符构成的环。请写一个程序,计算这两个字符环上最长连续公共字符串的长度。例如,字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起,构成一个环;字符串“MADJKLUVKL”的首尾连在一起,构成一个另一个环;“UVKLMA”是这两个环的一个连续公共字符串。
- 输入
- 一行,包含两个字符串,分别对应一个字符环。这两个字符串之间用单个空格分开。字符串长度不超过255,且不包含空格等空白符。
- 输出
- 输出一个整数,表示这两个字符环上最长公共字符串的长度。
- 样例输入
-
ABCEFAGADEGKABUVKLM MADJKLUVKL
- 样例输出
-
6
#include<stdio.h> #include<string.h> int gl,i1,j1,i2,j2,l1,l2,l,suit_l; //gl为公共子串的长度; char s1[256]={0},s2[256]={0},h1[512]={0},h2[512]={0},t[256]; int main() { //freopen("2.cpp","r",stdin); scanf("%s %s",s1,s2); strcpy(h1,s1); strcat(h1,s1); h1[strlen(h1)-1]=0; strcpy(h2,s2); strcat(h2,s2); h2[strlen(h2)-1]=0; l1=strlen(s1); l2=strlen(s2); l=(l1>l2?l2:l1); l1=strlen(h1); l2=strlen(h2); for(gl=1;gl<=l;gl++) { for(i1=0;i1<=l1-gl;i1++) //当前母串的起始点 { for(j1=0;j1<gl;j1++) //j:子串中的当前位置 { t[j1]=h1[i1+j1]; //h1+j1:环中当前位置 } t[j1]=0; for(i2=0;i2<=l2-gl;i2++) { for(j2=0;j2<gl;j2++) { if(h2[i2+j2]!=t[j2])break; } if(j2==gl) { suit_l=gl; break; } } if(j2==gl) //如果找到一个子串即可跳出循环 { break; } } } printf("%d",suit_l); return 0; }