题意: 要求找出字符串中前缀和后缀相同的且出现在字符串中的小串..
思路: kmp 的next 数组的使用...不可使用优化后的next 数组...原始的next 数组才能够记录相同的前缀和后缀是否在中间出现...
使用vis 数组记录后缀长度是否在字符串中间出现...
CODE
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
char t[1000005];
int next[1000005],vis[1000005];
int len;
void getnext()
{
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1||t[i]==t[j])
++i,++j,next[i]=j;
else j=next[j];
}
for(int i=0;i<len;i++)
vis[next[i]]++;
}
int main()
{
//freopen("P.txt","r",stdin);
while(~scanf("%s",t))
{
memset(vis,0,sizeof(vis));
len=strlen(t);
getnext();
int j=len;
int ok=0;
while(next[j]!=0)
{
if(vis[next[j]])
{
for(int i=0;i<next[j];i++)
printf("%c",t[i]);
ok=1;
break;
}
j=next[j];
}
if(ok==0) printf("Just a legend");
printf("\n");
}
return 0;
}