算法练习:KMP
看了大佬的思维:若母串长度为len,则目前找到的可能满足题目要求的长度为ne[len](只是满足前缀等于后缀),但若此时存在一个k(1<=k<len)满足ne[k]=ne[len],那么一定在字符串的中间也出现过,于是就成功找到满足条件的子串
我自己就尝试写,但是因为要获取其中满足条件的最长子串,我好像找不到更好的方法,如下是我的尝试,只通过9/10的数据集,最后一个数据TLE了
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
char p[N];
int ne[N];
int main()
{
int m;
cin>>m;
while(m--)
{
cin>>p+1;
int n=strlen(p+1);
//求next数组
for(int i=2,j=0;i<=n;i++)
{
while(j && p[i]!=p[j+1]) j=ne[j];
if(p[i]==p[j+1]) j++;
ne[i]=j;
}
bool flag=false;
int res=0;
for(int i=1;i<=n;i++)
{
int j=ne[n];
while(i!=n && j && ne[i]!=j)
{
j=ne[j];
}
if(i!=n && j && ne[i]==j)
{
res=max(res,j);
flag=true;
}
if(i==n && flag)
{
for(int k=1;k<=res;k++)
{
cout<<p[k];
}
cout<<endl;
}
if(i==n && !flag)
{
cout<<"not exist"<<endl;
}
}
}
return 0;
}