添加链接描述
思路
假设,next[n] = k ,意味着
s
0
,
s
1
,
s
2
,
s
3
,
s
4
.
.
.
.
.
s
k
−
1
=
=
s
n
−
k
+
1
,
s
n
−
k
+
2
.
.
.
.
.
s
n
s_0,s_1,s_2,s_3,s_4.....s_{k-1} == s_{n-k+1},s_{n-k+2}.....s_n
s0,s1,s2,s3,s4.....sk−1==sn−k+1,sn−k+2.....sn,子串即为
s
[
0
:
k
]
s[0:k]
s[0:k], 那么如何判断中间有没有子串呢?如果有子串,s[i:i+k]那么肯定s[0:i+k]的next就会是k,也就是说直接求next数组就可以了。求出next[n]看next[n]的值一共被取了几次。如果一次以上,那么我们就return s[0:next[n]],否则,我们就看next[next[n]],只要这不为-1那就是正确答案,为-1则不可能。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
string s;
int cnt[N], net[N], ans, len;
void get_next()
{
int i = 0, j = -1;
net[0] = -1;
while(i < len)
{
if(j == -1 || s[i] == s[j])
net[++i] = ++j;
else
j = net[j];
}
}
int main()
{
cin >> s;
len = s.size();
get_next();
for(int i = 0; i < len; i++)
cnt[net[i]]++;
ans = net[len];
if(ans == 0)
cout << "Just a legend" << endl;
else if(cnt[ans])
cout << s.substr(0, ans);
else if(net[ans])
cout << s.substr(0, net[ans]);
else
cout << "Just a legend" << endl;
//system("pause");
return 0;
}