POJ 2406 Power Strings 数据结构+KMP
2016-07-23 15:31
417 查看
Power Strings
Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%lld
& %llu
SubmitStatus
Description
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined
in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
Sample Output
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
解题思路:
一看就知道考的是kmp的失配函数/next数组的含义
看最后一个字符的f[i] 如果n%(n-f
)!=0那就是不循环的
否则循环节就是n/(n-f
)
面对这种题,只要自己对失配函数和next理解到一定程度,基本不用太多思考
a564
Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%lld
& %llu
SubmitStatus
Description
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined
in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcd aaaa ababab .
Sample Output
1 4 3
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
解题思路:
一看就知道考的是kmp的失配函数/next数组的含义
看最后一个字符的f[i] 如果n%(n-f
)!=0那就是不循环的
否则循环节就是n/(n-f
)
面对这种题,只要自己对失配函数和next理解到一定程度,基本不用太多思考
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn = 1000005 ; char str[maxn] ; int f[maxn] ; void getfail(){ f[0] = 0 ; f[1] = 0 ; int n = strlen(str); for(int i=1;i<n;i++){ int j = f[i] ; while(j&&str[i]!=str[j])j = f[j] ; f[i+1] = (str[i]==str[j]?j+1:0) ; } return ; } int main(){ while(~scanf("%s",str)){ if(str[0]=='.')break ; getfail(); // for(int i=0;i<=strlen(str);i++){ // printf("%d ",f[i]); // }printf("\n"); int n = strlen(str) ; int t = n-f ; if(n%t==0){ printf("%d\n",n/t); }else{ printf("1\n"); } } return 0; }
a564
相关文章推荐
- HDU 1867 A + B for you again 数据结构+KMP简单应用
- SDUT 2136 数据结构实验之二叉树的建立与遍历
- (模板题)sdut 2125 数据结构实验之串二:字符串匹配(KMP)
- HDU 3746 Cyclic Nacklace 数据结构+kmp周期类问题
- 二叉搜索树的插入和删除结点操作以及iterator的构造
- (模板题)sdut 3362 数据结构实验之图论六:村村通公路(prim求最小生成树)
- 复习(数据结构):字符串:c语言
- 数据结构-树-二叉树
- Code:Blocks 中文乱码问题原因分析和解决方法!
- HDU 4749 Parade Show 数据结构KMP变形
- SDUT2121数据结构实验之链表六:有序链表的建立
- SDUT 3373 数据结构实验之查找一:二叉排序树
- 数据结构之图的深度优先遍历和广度优先遍历
- 数据结构中的各种排序方法小结(JS实现)
- 1sql数据结构操作
- SDUT2119数据结构实验之链表四:有序链表的归并
- 复习(数据结构):队列:c语言
- 优先队列与堆
- SDUT3341数据结构实验之二叉树二:遍历二叉树
- Redis与Java - 数据结构