| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 12866 | Accepted: 6346 |
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 5
题目大意:给定一个字符串,求其相同前缀后缀的长度,由小到大输出所有情况。
解题思路:用kmp算法的next数组。由分析可知,整串字符串的相同前缀后缀中,若前缀子串有相同的前缀后缀,则
前缀子串的后缀一定等于后缀子串的后缀,即整串字符串有更小的相同前缀后缀,以此类推,可由大到小得出所有结果。
代码如下:
#include <cstdio>
#include <cstring>
int const maxn=400010;
char s[maxn];
int next[maxn];
int a[maxn]; //int a[maxn];
int len;
void get_next()
{
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1||s[i]==s[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
int cur;
while(scanf("%s",s)!=EOF)
{
int i=0;
memset(a,0,sizeof(a));
len=strlen(s);
cur=len;
a[0]=len; //初始前缀长度一定为字符串长度
get_next();
while(cur)
{
a[++i]=next[cur]; // next[前缀长度]即为前缀子串的前缀长度,直到next[]值为0是结束循环
cur=a[i];
}
for(int j=i-1;j>=0;j--)
printf("%d ", a[j]);
printf("\n");
}
return 0;
}
4316



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



