题意是在一个字符串中找出一个前缀一个后缀和一个中间的子串,并且这三个字符串相同,不能有重叠,这个串最长
比如 abxxabxxab 最长串为 ab
利用next 数组的性质,假设最长串为为 k=next[len], (len为给出字符串长度
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 1000015
int next[maxn];
char str[maxn];
int len;
void getnext()
{
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1||str[i]==str[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
bool kmp(char *s1,char *s2,int begin,int end,int m)
{
int j=0;
int i=0,len1=end-begin;
while(i<len1)
{
if(j==-1||s1[i]==s2[j])
{
i++;
j++;
}
else j=next[j];
if(j==m)return true;
}
return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
len=strlen(str);
memset(next,0,sizeof(next));
getnext();
int k=next[len];
int ans=0;
while(true)
{
if(len>=3*k&&kmp(str+k,str,k,len-k,k)&&kmp(str+len-k,str,len-k,len,k))
{
//printf("ok\n");
ans=k;
break;
}
k--;
if(k<=0)break;
}
printf("%d\n",ans);
}
return 0;
}