这道题是昨天晚上9点多看的,今天早上来了后想了想,,感觉有思路了,吃过饭后就ac了,,,没注意到数据大小,,吃了一次re。。。。。。。这道题算是next数组的一个应用,,,有点折半查找的感觉,,,求字符串循环节和这道题,都是next数组的妙用,,,看来对next数组有一个清晰的理解非常必要啊!题目:
Time Limit:2000MS | Memory Limit:65536K | |
Total Submissions:6869 | Accepted:3207 |
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 18 1 2 3 4 5ac代码:
#include <iostream> #include <cstdio> #include <string.h> const int N=400010; char str[N]; int nextt[N],num[N]; void get_nextt(int len){ int i,j=0; nextt[0]=0; for(i=1;i<len;++i){ int temp=nextt[i-1]; while(temp&&str[i]!=str[temp]) temp=nextt[temp-1]; if(str[i]==str[temp]) nextt[i]=temp+1; else nextt[i]=0; } } int main(){ while(scanf("%s",str)!=EOF){ int len=strlen(str); get_nextt(len); int j=1; for(int i=nextt[len-1];i>=1;i=nextt[i-1]){ num[j++]=i; } num[0]=len; for(int i=j-1;i>=0;i--) printf("%d ",num[i]); printf("\n"); } return 0; }