传说在这片魔导大陆上有一位死神曾降下过神谕,如果谁能够解决其留下的这道问题,它就能保其永生!.给定一个长度为n的字符串S,试选择一段连续子串S[L~r],满足2<l<r<n且S[l~r]是字符串S的前缀,即S[L~r]与S[1~r-1+1]米相同。问能够选出的满足条件的连续子串的最长长度是多少?哦对,忘了说了,这片大陆现在是不死族的领地。
输入 仅一个由小写字母组成的字符串S。1<|S|< 500000。
输出 一个整数,表示最长长度。
样例输入1
ababa
样例输入2
abcde
样例输出1
3
样例输出2
0
题意:求出字符串最大的前缀,这个前缀在主串后面有和他相同的一段。
心得:一开始做这道题的时候题目看错了,直接误以为求最大前缀next的板子题,但实际上仔细一想这个思路是对的。(就是说无论那个相同的段在哪个地方,next都能遍历到)属于是瞎猫碰上死耗子了(哭哭)。
#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
using namespace std;
const int N=2e6+5;
char s[N];
int nxt[N];
int ma=-1;
void next(){
int i=0,j=-1;
nxt[0]=-1;
while (i<strlen(s)){
if (j==-1||s[i]==s[j]){
i++;j++;
nxt[i]=j;
ma=max(j,ma);
}
else{
j=nxt[j];
}
}
}
void work(){
cin>>s;
next();
cout<<ma;
}
signed main(){
CIO;
work();
return 0;
}