HDU1358 Period KMP循环节问题
来源:互联网 发布:pkpm软件视频教程 编辑:程序博客网 时间:2024/05/18 06:27
题目大意:给你一个字符串,让你求出从字符串的第2个字符开始,其长度为i的前缀中有多少个循环体大于1的循环节。
分析:KMP的next数组循环节问题。遍历字符串中的每一个位置,逐一判断即可。
字符串满足next[ i ]!=0&&i%(i-next[ i ])==0时存在循环节,且循环体大小为(i-next[ i ])。
#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MAX=1000010;char T[MAX];int next[MAX],len;void init_next(){ int i=0,j=-1; next[0]=-1; while(i<len) { if(j==-1||T[i]==T[j]) { i++; j++; next[i]=j; } else j=next[j]; }}void KMP(){ int i; for(i=2;i<=len;i++) { if(next[i]!=0&&i%(i-next[i])==0) printf("%d %d\n",i,i/(i-next[i])); }}int main(){ int J=0; while(scanf("%d",&len)&&len) { scanf("%s",T); init_next(); printf("Test case #%d\n",++J); KMP(); printf("\n"); } return 0;}
0 0
- HDU1358 Period KMP循环节问题
- [KMP求最小循环节][HDU1358][Period]
- HDU1358 Period(KMP,找循环节)
- hdu1358 Period (循环节)
- HDU1358 Period(KMP找循环前缀)
- hdu1358 KMP循环节
- Period hdu1358 KMP
- hdu1358 period ,Kmp
- hdu1358 Period kmp+模拟
- hdu1358 Period(kmp)
- HDU1358 Period【KMP】
- hdu1358 Period(kmp周期)
- hdu1358 Period--KMP
- HDU1358 Period(KMP)
- HDU1358-Period(KMP)
- HDU1358 Period(KMP)
- HDU1358-Period(kmp-求前缀长度和最小循环节长度 )
- hdu1358(KMP+最小循环节)
- Android Dialog 去掉的Title
- 使用JDBC获取各数据库的Meta信息——表以及对应的列
- STL algorithm算法inplace_merge(24)
- 斐波拿契数列实现
- Axis2 创建 web service (2) : 同步异步调用
- HDU1358 Period KMP循环节问题
- [LeetCode]Merge Intervals && Insert Interval
- 适量消极情绪有助于提高工作能力
- Android中IntentService的原理及使用
- 请commit!commit!
- Android源码分析之SparseArray
- 有事心不乱
- Android内核&源码下载
- MySQL开发规范