Period(KMP,循环节问题)
2015-08-16 16:37
423 查看
题意:
求给你个串,前i位子串由某个字符串重复k次得到,求所有的i和k
分析:
i-next[i]恰好是一个循环节
求给你个串,前i位子串由某个字符串重复k次得到,求所有的i和k
分析:
i-next[i]恰好是一个循环节
#include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <string> #include <cctype> #include <complex> #include <cassert> #include <utility> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; typedef pair<int,int> PII; typedef long long ll; #define lson l,m,rt<<1 #define pi acos(-1.0) #define rson m+1,r,rt<<11 #define All 1,N,1 #define read freopen("in.txt", "r", stdin) const ll INFll = 0x3f3f3f3f3f3f3f3fLL; const int INF= 0x7ffffff; const int mod = 1000000007; int n,next[1000001]; char s[10000001]; void getNext(){ next[0]=-1; int i=0,j=-1; while(i<n){ if(j==-1||s[i]==s[j]){ i++; j++; next[i]=j; } else j=next[j]; } } int main() { int num=0; while(~scanf("%d",&n)){ if(n==0)break; scanf("%s",s); printf("Test case #%d\n",++num); getNext(); for(int i=1;i<=n;++i){ if(i%(i-next[i])==0&&next[i]!=0) printf("%d %d\n",i,i/(i-next[i])); } printf("\n"); } return 0; }
相关文章推荐
- hdu 2188 悼念512汶川大地震遇难同胞——选拔志愿者(Bash Game)
- Oracle_自适应游标共享的整体执行流程
- Fresco使用总结
- 编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。
- 用C / C++ 实现快速排序
- 黑马程序员——C语言之数组
- 【Andrioid】在Gradle编译时生成一个不同的版本号,动态设置应用程序标题,应用程序图标,更换常数
- 2015年华为提前招聘机试题--输出最大的三位数
- Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用
- node Express 创建一个web应用
- MFC贪吃蛇
- UVa 1584 - Circular Sequence
- windows下的oracle database 实例无法自动open database的问题
- 工作的几点思考
- JAVASCRIPT——图片滑动效果
- 网站
- linux学习之路(8)
- Number Sequence(KMP,判断子串 模板)
- Jquery实现鼠标hover图片遮罩弹出提示层特效
- Eclipse 一直提示 loading descriptor for 的解决方法(转)