poj 2406 : acm 数据结构Power Strings (KMP)
2016-05-25 17:34
239 查看
题意:给出一个串,问你这个最多是多少个相同的字串重复连接而成的。如:abcabcabc则最多有3个abc连接而成。
求出长度,求出循环节,相除即可
#include<iostream>
#include<cstring>
using namespace std;
const int Max = 100000005;
char str[Max];
int len, next[Max];
//kmp问题模板...
void get_next(){
int i = 0, j = -1;
next[0] = -1;
while(i < len){
if(j == -1 || str[i] == str[j]){
++i; ++j;
next[i] = j;
}
else j = next[j];
}
}
int main(){
while(scanf("%s", str) != EOF){
if(str[0] == '.') break;
len = strlen(str);
get_next();
int ans = 1;
if(len % (len-next[len]) == 0) // 看整个长度len能分解成x个这种串。
ans = len / (len-next[len]);
printf("%d\n", ans);
}
return 0;
}
求出长度,求出循环节,相除即可
#include<iostream>
#include<cstring>
using namespace std;
const int Max = 100000005;
char str[Max];
int len, next[Max];
//kmp问题模板...
void get_next(){
int i = 0, j = -1;
next[0] = -1;
while(i < len){
if(j == -1 || str[i] == str[j]){
++i; ++j;
next[i] = j;
}
else j = next[j];
}
}
int main(){
while(scanf("%s", str) != EOF){
if(str[0] == '.') break;
len = strlen(str);
get_next();
int ans = 1;
if(len % (len-next[len]) == 0) // 看整个长度len能分解成x个这种串。
ans = len / (len-next[len]);
printf("%d\n", ans);
}
return 0;
}
相关文章推荐
- POJ 1611 ACM数据结构The Suspects (并查集)
- 数据结构实验5-2
- C/C++、JAVA 数据结构 :双向循环链表
- 字符串操作
- Poj 3320 acm 数据结构 哈希表入门
- 数据结构实验-用C++实现带头结点的循环链表
- java数据结构-Vector
- 【数据结构学习】二叉树
- HDU1702 acm 数据结构 ACboy needs your help again!
- HDU1022 acm 数据结构 Train Problem I
- 每天一点数据结构之二叉树的插入与创建
- 浅谈算法和数据结构: 九 平衡查找树之红黑树
- 数据结构[刷水]
- 《数据结构》3.1双栈--按栈号进行操作
- 常用的数据结构算法
- 《数据结构》3.1双栈结构
- C++ map,set内部数据结构
- 数据结构->冒泡排序
- 数据结构基础之循环队列C语言实现
- 《 常见算法与数据结构》平衡查找树(2)——红黑树(附动画)