题意 给出一个串,求出最长的一个字串,使得他是原串的前缀,也是后缀,并且在中间也能找到一个该串,三个串不能重合;
利用KMP的next数组,通过自己匹配自己,next[i]代表了前i的字符前缀和后缀相等的最长长度,从len-1往前暴力
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1e6+10;
char s[maxn];
int nex[maxn];
void getnext()
{
int i=0,j=-1;
nex[0]=-1;
int len=strlen(s);
while(i<len)
{
if(j==-1||s[i]==s[j])
{
i++;j++;
nex[i]=j;
}
else
j=nex[j];
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
getnext();
int len=strlen(s);
int m=nex[len];
int ans=0;
for(int i=len-1;i>=2;i--)
{
int k=nex[i];
while(k>0)
{
if(k<=m&&k+k<=i&&i+k<=len)
{
ans=max(ans,k);
break;
}
k=nex[k];
}
}
printf("%d\n",ans);
}
return 0;
}