题解思路:
参考楼下大佬的思路:是否有和最后一个next[]相同的next值在数组中间出现,若存在最后一个next就是答案。
否则,next[最后一个next]才是解(当然,特判解不存在)。

这里重点贴一下代码,其中未注释代码为从 0 开始的 next 数组求解,注释的代码则是从 1 开始的 next 数组求解(注释的代码也是AC代码)。

代码中 next 存储的是指定位置最长前缀的长度(不是位置)。

#include <bits/stdc++.h>

using namespace std;

#define ll long long

const int N = 1000009;

string s;
int nex[N], n;
char c[N];

void kmp() {
    n = s.length();

//    for(int i = 1; i <= n; i ++) c[i] = s[i - 1];
//    for(int i = 2, j = 0; i <= n; i ++){
//        while(j > 0 && c[i] != c[j + 1]) j = nex[j];
//        if(c[i] == c[j + 1]) j ++;
//        nex[i] = j;
//    }   return ;

    for(int i = 1, k = 0; i < n; i ++){
        while(k && s[i] != s[k]) k = nex[k - 1];
        if(s[i] == s[k]) k ++;
        nex[i] = k;
    }

}
int main() {
    cin >> s;
    kmp();

    int p = 0;
    for(int i = 0; i < n - 1; i ++)
        if(nex[n - 1] == nex[i]) {
            p = nex[n - 1];
            break;
        }
    if(p == 0) p = nex[nex[n - 1] - 1];
    if(p == 0) cout << "Just a legend";
    else cout << s.substr(0, p);

//    int ans = 0;
//    for(int i = 1; i < n; i ++) {
//        if(nex[i] == nex[n]) {
//            ans = nex[i];
//            break;
//        }
//    }
//    if(ans == 0) ans = nex[nex[n]];
//    if(ans == 0) cout << "Just a legend";
//    else {
//        for(int i = 1; i <= ans; i ++) cout << c[i];
//    }

    return 0;
}