Seek the Name, Seek the Fame
Step1. Connect the father's name and the mother's name, to a new string S.
Step2. Find a proper prefix-suffix string of S (which is not only the prefix, but also the suffix of S).
Example: Father='ala', Mother='la', we have S = 'ala'+'la' = 'alala'. Potential prefix-suffix strings of S are {'a', 'ala', 'alala'}. Given the string S, could you help the little cat to write a program to calculate the length of possible prefix-suffix strings of S? (He might thank you by giving your baby a name:)
Restrictions: Only lowercase letters may appear in the input. 1 <= Length of S <= 400000.
ababcababababcabab aaaaa
2 4 9 18 1 2 3 4 5
题目让我么求得是既是整个字符串的前缀又是后缀的,所以答案并不是next数组的每一个数。
首先字符串本身就是一个,然后求出next数组后next[len]其实就是整个字符串的前后缀最长长度,这样我们有求出一个长度,然后根据已经得到的最长的原本字符串的前后缀公共子串,我们通过i = next【i】就可以求得这个公共子串的子串,当然也是原字符串的的前后缀子串了。
code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1010000;
char s[MAXN];
int Next[MAXN];
int ans[MAXN];
void getNext(){
int i = -1,j = 0;
int lens = strlen(s);
Next[0] = -1;
while(j < lens){
if(i == -1 || s[i] == s[j]){
i++,j++;
Next[j] = i;
}
else
i = Next[i];
}
return;
}
int main(){
while(~scanf("%s",s)){
getNext();
int cnt = 0;
int i;
for(i = strlen(s); Next[i] != -1; i = Next[i]){
ans[cnt++] = i;
}
printf("%d",ans[cnt-1]);
for(i = cnt-2; i >= 0; i--){
printf(" %d",ans[i]);
}
printf("\n");
}
return 0;
}
467



被折叠的 条评论
为什么被折叠?



