怎么那么巧妙。。自己没有想到。
转自http://www.cnblogs.com/19992147orz/p/6284076.html
#include<iostream>
#include<map>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
#include<iomanip>
using namespace std;
const int maxn=1000005;
char s[maxn];
int nxt[maxn];
int used[maxn];
void getnext(){
int len=strlen(s);
int k=-1;
int j=0;
nxt[0]=-1;
while(j<=len-1){
if(k==-1||s[j]==s[k]){
j++;
k++;
nxt[j]=k;
}
else{
k=nxt[k];
}
}
}
void init(){
memset(used,0,sizeof(used));
memset(nxt,0,sizeof(nxt));
}
int main(){
while(cin>>s){
init();
getnext();
int len=strlen(s);
for(int i=1;i<=len-1;i++)used[nxt[i]]=1;//用这方法就巧妙地处理了中间有公共子串的情况
used[0]=0;
for(int i=len;i!=-1;i=nxt[i])
if(used[nxt[i]]){
for(int j=0;j<nxt[i];++j)cout<<s[j];
cout<<endl;
return 0;
}
printf("Just a legend\n");
}
}