题目描述
有两个字符构成的环。请写一个程序,计算这两个字符环上最长公共字符串的长度。例如,字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起,构成一个环;字符串“MADJKLUVKL”的首尾连在一起,构成一个另一个环;“UVKLMA”是这两个环的一个公共字符串。
输入
若干行,每行包括两个不包含空格的字符串。这两个字符串用空格分开。若其中某个字符串的长度为1,则表示结束。否则,每个字符串的首尾相连即为一个环。每个环上字符总数不超过255。
输出
为每行输入,分别输出一个整数,表示这两个字符环上最长公共字符串的长度。最后一行没有输出。
样例输入
ABCEFA24*92(GADEGKABUVKLM AD&30ijJKLAaUVKLM 313435t974 008bac A 33
样例输出
6 0
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
string a,b;
int ans=0,tmp=0,x;
while(cin>>a>>b){
int lena=a.length();
int lenb=b.length();
if(lena==1||lenb==1)
break;
a+=a; //构成环
b+=b;
x=min(lena,lenb);
ans=0;
for(int i=0;i<lena;i++)
for(int j=0;j<lenb;j++){
while(a[i+tmp]==b[j+tmp]&&tmp<=x)
tmp++;
ans=max(ans,tmp);
tmp=0;
}
printf("%d\n",ans);
}
return 0;
}