这道题是昨天晚上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;
}