字符串的前綴是指不包含最後一個字符的所有以第一個字符開頭的連續子串;後綴是指不包含第一個字符的所有以最後一個字符結尾的連續子串。例如對於字符串 abacaba,其前綴有 a, ab, aba, abac, abacab,後綴有bacaba, acaba, caba, aba, ba, a。最長公共前後綴就是 aba。現給出一個長度爲 N 的字符串 S,對於每個 M (0<=M<N),求出連續子串 S[0…M] 的最長公共前後綴。
輸入格式:
輸入數據僅有一行,包含一個長度不超過 100,000 的僅由字母 a-z 構成的字符串。
輸出格式:
對於每個 M (0,1,2,…,N−1),輸出對應的最長公共前後綴長度,以空格分隔,且行尾不得有多餘空格。
輸入樣例:
abcdabcdabce
輸出樣例:
0 0 0 0 1 2 3 4 5 6 7 0
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
int Next[100001];
string s;
void getNext(){
int j =0, k =-1;
Next[0]=-1;
while(j < s.size()){
if(k ==-1|| s[j]== s[k]){
j++;
k++;
Next[j]= k;
}
else
k =Next[k];
}
}
int main ()
{
cin>>s;
getNext();
for(int i=1;i<=s.size();i++){
if(i==1)
printf("%d",Next[i]);
else
printf(" %d",Next[i]);
}
return 0;
}