题意:
Asterix,Obelix和他们的临时伙伴Suffix、Prefix已经最终找到了和谐寺。然而和谐寺大门紧闭,就连Obelix的运气也没好到能打开它。
不久他们发现了一个字符串S(|S|<=1000000),刻在和谐寺大门下面的岩石上。Asterix猜想那一定是打开寺庙大门的密码,于是就大声将字符串朗读了出来,然而并没有什么事发生。于是Asterix又猜想密码一定是字符串S的子串T。
Prefix认为T是S的前缀,Suffix认为T是S的后缀,Obelix却认为T应该是S中的某一部分,也就是说,T既不是S的前缀,也不是S的后缀。
Asterix选择子串T来满足所有伙伴们的想法。同时,在所有可以被接受的子串变形中,Asterix选择了最长的一个(因为Asterix喜欢长的字符串)当Asterix大声读出子串T时,寺庙的大门开了。 (也就是说,你需要找到既是S的前缀又是S的后缀同时又在S中间出现过的最长子串)
现在给你字符串S,你需要找到满足上述要求的子串T。
输入格式:
一个长度在[1,1000000]间的只包含小写字母的字符串S。
输出格式:
输出子串T,如果T不存在,输出 "Just a legend",不包含引号。
思路:
就是找出一个最长子串,这个子串在开头结尾和中间都出现过。
AC代码:
//
// ................ .................,`..,`.................
// .....=^..=^..=^. .=^..=^..=^..=^..=^..=^..=^...*.........
// ...*,/\`,/\^,\..,\..,\..,/\`,/\`,/\`...*...* ...*,\..,\..,\..,\..,\..,\..,\..=^=^,`,`,`,`
// .,].=^..=^=^,`=^,`=^,`=^=^..=^..=^...,]..,]. .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^*.........
// .....................,`..,`..,`..................................... .....,`..,`..,`..,`..,`..,`..,`.
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^. .=^..=^..=^..=^..=^..=^.........
// ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,/\`,/\`,\..,\..,\..,\..,\..,\..,`,`
// ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..=^..,`=^,`=^,`=^,`=^,`=^,`=^....
// .............,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..........,`..,`..,`..,`..,`..,`.
// .....=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.........
// ...*,/\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,`,`
// .,].=^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^....
// .............,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.........
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
// ...*,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,/\`...*...*
// .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^...,]..,].
// .........,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....................................
// .=^..=^..............................................=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.....
// ...*,\..,\...\/`.\/`.\/`.\/`,`,`,`,`,`,`,`,`.\/`.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=/\`,/\`...*
// .,].,`=^,`=^.[,`.[,`.[,`.[,`.................[,`.[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^=^=^...,].
// .,`..,`. .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.................
// ........ .............................=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.....
// ,`,`,`,`.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=^..
// .........[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..
// .....,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
// ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..
// ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^
// .........,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.
// .=^..=^..=^..=^..=^..=^..=^..=^.. ...........=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
// ...*,\..,\..,\..,\..,\..,\..,\..,\..=^=^.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..
// .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^*..[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^
// .........,`..,`..,`..,`..,`..,`..,`..,`. .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.
// .....=^..=^..=^..=^..=^..=^..=^......... .............................................=^..=^..=^..=^..=^.
// ,/\^,\..,\..,\..,\..,\..,\..,\..,`,` .@=^,\..,\..,\..,\..,\..
// =^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^.... ,[\/,`=^,`=^,`=^,`=^,`=^
// .........,`..,`..,`..,`..,`..,`..,`. .,`..,`..,`..,`..,`.
// .=^..=^..=^..=^..=^..=^..=^..=^..=^. .=^..=^..=^.. ......
// ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\.. ,\..,\..,\..=^=^,`,`
// ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^ ,`=^,`=^,`=^=^*.....
// .........,`..,`..,`..,`..,`..,`..,`..,`..,`* .,`..,`..,`.
// .....=^..=^..=^..=^..=^..=^..=^..=^..=^....* .=^.. ......
// ,/\^,\..,\..,\..,\..,\..,\..,\..,\..,\..=^.. ,\..=^=^,`,`
// =^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^.. ,`=^=^*.....
// .....,`..,`..,`..,`..,`..,`..,`..,`..,`....* .,`.
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^...*. ....
// ,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=^..
// ,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..
// .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....
// .........=^..=^..=^..=^..=^..=^..=^..=^.....
// .\/`,\..,\..,\..,\..,\..,\..,\..,\..,`,`
// .[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^....
// .,`..,`..,`..,`..,`..,`..,`..,`.
// ................................
// ,`,`.\/`.\/`.\/`,`,`,`,`
//
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
char a[N];
int ne[N];
void solve(){
int i,j=0;
cin>>(a+1);
int len=strlen(a+1);
for(i=2;i<=len;i++){ //与自己匹配
while(j&&a[i]!=a[j+1]) j=ne[j];
if(a[i]==a[j+1]) j++;
ne[i]=j;
}
int flag=0;
int le=ne[len]; //le记录最大长度
int maxl=0;
while(le){
for( i=2,j=0;i<=len-1;i++){
while(j&&a[i]!=a[j+1]) j=ne[j];
if(a[i]==a[j+1]) j++;
if(j==le){
flag=1;
break;
}
}
if(flag==1) break;
le=ne[le];
}
if(!le){
cout<<"Just a legend\n";
}
else {
for(int i=1;i<=le;i++){
cout<<a[i];
}
cout<<"\n";
}
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t=1;
// cin>>t;
while(t--){
solve();
}
}