| Time Limit:2000MS | Memory Limit:65536K | |
| Total Submissions:8194 | Accepted:3844 |
Description
The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. They seek the name, and at the same time seek the fame. In order to escape from such boring job, the innovative little cat works out an easy but fantastic algorithm:
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
The input contains a number of test cases. Each test case occupies a single line that contains the string S described above.
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数组的一个应用。next数组记录的就是当前字符 之前的 字符串 最长的相等的前后缀 的长度。
具体可以看看kmp中next 的资料。 这题是kmp 的基础
//Memory: 4120 KB Time: 172 MS
//Language: C++ Result: Accepted
#include
#include
const int MAX=500000;
char a[MAX]; int next[MAX];
void print(int len,int m) // 逆序输出
{
if(len==0) return;
print(next[len],1);
printf("%d",len);
if(!m) printf("\n");
else printf(" ");
}
int main()
{
// freopen("in.txt","r",stdin);
int i,j,len;
while(scanf("%s",a)!=EOF)
{
len=strlen(a);
next[0]=-1;
i=0; j=-1;
while(i {
if(j==-1 || a[i]==a[j])
{
i++; j++;
next[i]=j;
}
else j=next[j];
}
print(len,0);
}
return 0;
}
本文介绍了一个有趣的KMP算法应用场景——寻找字符串中既是前缀也是后缀的子串。通过一个C++实现的例子,展示了如何利用KMP算法的next数组来高效解决这一问题。
4525

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



