题解思路:
参考楼下大佬的思路:是否有和最后一个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;
}

京公网安备 11010502036488号