题意:
给出一个字符串,求不等于前后缀的最长的一段子串,使得这段子串即是前缀也是后缀
Solution:
这道题如果使用KMP解决并不这么直观
使用z算法可以轻松地解决(如果没有学过z算法请点击这里)
处理出z数组后,我们记录前i项的z的最大值
对于第i+1项,如果z[i+1]+i==len&&max[i]>=z[i+1],即从i+1开始能匹配到后缀,且前面存在一个相同的串,他所代表的串就是符合条件的
找到最大的即可
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int z[1000010],n,m,r,l;
char b[1000010];
int maxn=0;
int main()
{
scanf("%s",b);
m=strlen(b);
for (int i=1;i<=m;i++)
{
if (i>r)
{
int t=i,bg=0;
while (b[t]==b[bg])
t++,bg++;
z[i]=bg;
r=t-1;
l=i;
}
else
{
if (z[i-l]<r-i+1) z[i]=z[i-l];
else
{
int t=r+1,bg=r-i+1;
while (b[t]==b[bg])
t++,bg++;
z[i]=bg;
r=t-1;
l=i;
}
}
}
int nw=0;
for (int i=1;i<m;i++)
{
if (i+z[i]==m&&nw>=z[i])
maxn=max(maxn,z[i]);
nw=max(nw,z[i]);
}
if (maxn==0) printf("Just a legend");
for (int i=0;i<maxn;i++)
printf("%c",b[i]);
}