题意:给你一个字符串,问你能否找到三个子串(首,中间部分,尾)相等,如果可以输出最长的子串长度!
解法:kmp,首尾相同的情况下,找中间部分看是否有,用首子串作匹配串,中间部分为文本串!!
#include<iostream>
#include<stdio.h>
#include<string.h>
int next[1000005];
char str[1000005];
int n;
void mn()
{
int k=-1,j=0;
next[0]=-1;
while(j<n)
{
if(k==-1||str[k]==str[j])
{
k++;
j++;
next[j]=k;
}
else
k=next[k];
}
}
int kmp(int m)
{
int i=m,k=0;
while(i<n-m)
{
if(k==-1||str[i]==str[k])
{
i++;
k++;
}
else
k=next[k];
if(k==m)
return k;
}
return -1;
}
int main()
{
int T ;
scanf("%d",&T);
while(T--)
{
scanf("%s",str);
n=strlen(str);
if(n<3)
{
printf("0\n");
continue;
}
mn();
int maxn=-1,l=n;
while(next[l]>0)
{
int ans=kmp(next[l]);
if(ans>maxn)
{
maxn=ans;
break;
}
l=next[l];
}
printf("%d\n",maxn>0?maxn:0);
}
return 0;
}