POJ 2752
来源:互联网 发布:原油api最新数据 编辑:程序博客网 时间:2024/06/06 08:40
http://poj.org/problem?id=2752
Seek the Name, Seek the Fame
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 15797 Accepted: 8020
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
For each test case, output a single line with integer numbers in increasing order, denoting the possible length of the new baby’s name.
Sample Input
ababcababababcabab
aaaaa
Sample Output
2 4 9 18
1 2 3 4 5
这个是考察对于Kmp中next 数组的理解情况的。
大致的题意就是给你个字符串,问他有多少个前缀子串和后缀子串相等,把相等的个数输出。
代码:
#include <stdio.h>#include <iostream>#include <string.h>#include <algorithm>#define N 1000005using namespace std;char s[N];int nexts[N],tmp[N];void get_nexts(char s[],int nexts[]){ int i=0,k=-1,len=strlen(s); nexts[0]=-1; while(i<len) { if(k==-1||s[i]==s[k]) { i++,k++; nexts[i]=k; } else k=nexts[k]; }}int main(){ while(~scanf("%s",s)) { get_nexts(s,nexts); int len=strlen(s),i=0; while(nexts[len]) //这个是非常神奇的代码,nexts[len]表明了整个字符串中最大的前缀后缀子串相等的个数是多少。 { tmp[i++]=nexts[len]; len=nexts[len]; //一级一级的扫,整个字符串开始一直扫到没有为止。 } if(nexts[0]==nexts[len]) printf("1 "); for(int j=i-1;j>=0;j--) { printf("%d ",tmp[j]); } printf("%d\n",strlen(s)); //这个有点奇怪的判断,因为前缀子串是不包含整个字符串的,后缀也是不包含的。应该是题的原因。。。。可能我读题不仔细,没有看清类似的注意事项! } return 0;}
- POJ 2752
- poj 2752
- poj 2752
- POJ 2752
- poj 2752
- POJ 2752
- poj(2752)
- POJ 2752
- poj 2752
- POJ 2752
- poj 2752
- POJ-2752
- POJ 2752
- POJ-2752
- poj 2752
- Poj 2752
- poj 2752
- POJ 2752
- ImageLoader工具类
- 编程之美2.16最长递增子序列
- 机器学习:防止过拟合的方法
- HDU1180 诡异的楼梯
- 单词王上线了
- POJ 2752
- NSMethodSignature和NSInvocation
- 转-思维要裂变要敢闯想
- wstring
- (十)【续】网络框架篇(RxJava+OkHttp+Gson)
- LeetCode 249. Group Shifted Strings
- IOS delegate 实例
- Struts2项目环境配置_Struts2.2版本以后必须导入的jar包
- 初学Java的类和对象