前言:之前纠结了很久的字符串哈希原来是有结论的
注意我们的数组一定要开long long
我们来看一下题目
这个题目我们可以用二分 + 哈希来做,我们要先验证一下二分的可行性,我们如果找到一个不符合的1 - i ,那么不可能存在一个j ( j > i )使得 1 - j 成立
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = (int)1e6+5;
const int P = 233;
const int Mod = 998244353;
string s;
int n;
int p[N], h[N];
void ini() {
p[0] = 1, h[0] = 0;
for(int i = 1; i <= n; i++) {
p[i] = p[i-1] * P % Mod;
h[i] = (h[i-1] * P % Mod + s[i]) % Mod;
}
}
int get(int l, int r) {
return ((h[r] - h[l-1] * p[r-l+1] % Mod) % Mod + Mod) % Mod;
}
bool check(int len, int val) {
for(int i = 2; i <= (n-len); i++) { // 从 i=1 开始
if(get(i, i+len-1) == val) {
//cout << "在 " << i << endl;
return true;
}
}
return false;
}
signed main() {
cin >> s;
n = s.size(); s = ' ' + s;
ini();
vector<int> a;
for(int i = 1; i <= n-2; i++) {
if(get(1, i) == get(n-i+1, n)) {
a.push_back(i);
}
}
int l = -1, r = a.size();
int ans = 0;
while(l + 1 < r) { // 恢复二分查找
int mid = (l + r) >> 1;
int u = a[mid];
if(check(u, get(1, u))) {
l = mid;
ans = u;
//cout << " 答案有 " << u << endl;
} else {
r = mid;
}
}
if(ans > 0) {
cout << s.substr(1, ans);
} else {
cout << "Just a legend";
}
return 0;
}