题意:在一个字符串中寻找一个子串,要求子串出现在原串的开头,中间和结尾
思路:KMP中next数组的灵活运用,只要判断最后next [len]的数字是否在之前出现过,即是否在中间出现过即可
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 1000009
int vis[N];
char str[N];
int next[N];
int len;
void getnext()
{
int i,j;
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];
}
}
int main()
{
while(~scanf("%s",str))
{
len=strlen(str);
getnext();
memset(vis,0,sizeof vis);
for(int i=1;i<len;i++)
{
vis[next[i]]=1;
}
int t=next[len];
int flag=0;
while(t)
{
if(vis[t])
{
flag=1;
str[t]='\0';
break;
}
else
t=next[t];
}
if(flag)
printf("%s\n",str);
else
cout<<"Just a legend"<<endl;
}
return 0;
}