/* Accepted */
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int tab[600][600];
string s1;
string s2;
int len1,len2;
int globalmax=0;
int main()
{
cin>>s1>>s2;
len1=s1.size();
len2=s2.size();
int minlen=min(len1,len2);
s1+=s1; //concatenate
s2+=s2;
len1=s1.size();
len2=s2.size();
memset(tab,0,sizeof(tab));
for(int i=0;i<len1;i++)
{
for(int j=0;j<len2;j++)
{
if(i>0&&j>0)
{
if(s1[i]==s2[j]&&tab[i-1][j-1]<minlen) //shouldn't recount (no longer than minlen)
{
tab[i][j]=tab[i-1][j-1]+1;
}
else
{
tab[i][j]=0;
}
}
else
{
tab[i][j]= (s1[i]==s2[j]);
}
globalmax=max(globalmax,tab[i][j]);
}
}
// for(int i=0;i<len1;i++)
// {
// for(int j=0;j<len2;j++)
// {
// printf("%d ",tab[i][j]);
// }
// printf("\n");
// }
printf("%d",globalmax);
}
Idea : repeat each string (s+=s) . find longest continuous substring. guarantee substring length <= min of the two input string.