题意:
给你一个字符串,可以看作“EAEBE”,A和B可以是任意字符或字符串(可以为空),求E的最大长度。
思路:
先求出 nxt 数组,如果存在符合题目要求的 EAEBE 形式,假设 nxt[len]=i,则存在x在下标为 [2*i,len-i) 的字符串当中使得 nxt[x]==i 。
这样求的是无重叠的最大长度
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
char s[maxn];
int nxt[maxn];
int len;
void getnxt()
{
int j,i=0;
j = nxt[0] = -1;
while(i<len)
{
if(j==-1 || s[i]==s[j])
{
i++,j++;
nxt[i] = j;
}
else
j = nxt[j];
}
}
int KMP()
{
for(int i=nxt[len];i;i=nxt[i])
for(int j=2*i;j<len-i;j++)
if(nxt[j]==i)
return i;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",&s);
len = strlen(s);
getnxt();
int k = KMP();
printf("%d\n",k);
}
return 0;
}