Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 16998 | Accepted: 8664 |
Description
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:)
Input
Restrictions: Only lowercase letters may appear in the input. 1 <= Length of S <= 400000.
Output
Sample Input
ababcababababcabab aaaaa
Sample Output
2 4 9 181 2 3 4 5
这题要深入理解next的含义是前缀后缀的长度最大值,不断递归找NEXT等于缩小前缀后缀相同长度的直播
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int N = 400010; char str1[N]; int len1; int res[N], nex[N]; void getnext(); int main() { while(scanf("%s",str1)!=EOF) { len1=strlen(str1); getnext(); memset(res,0,sizeof(res)); int x=0; for(int i=len1;i!=0;i=nex[i]) { res[x++]=i; } for(int i=x-1;i>=0;i--) { printf("%d%c",res[i],i==0?'\n':' '); } } return 0; } void getnext() { int k=-1, j=0; nex[0]=-1; while(j<len1) { if(k==-1||str1[j]==str1[k]) { k++,j++; nex[j]=k; } else { k=nex[k]; } } return ; }