hdu 1358 Period(KMP循环节)
2016-01-23 18:10
323 查看
题意:给定一个字符串,求出所有循环的前缀串,输出前缀串的长度和循环的次数(大于一才算循环串)。
思路:遍历字符串,计算出每个位置的循环次数,大于一则输出。
循环节长度:i-next[i]
循环次数:I/(i-next[i])
思路:遍历字符串,计算出每个位置的循环次数,大于一则输出。
循环节长度:i-next[i]
循环次数:I/(i-next[i])
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define MAXN 1000005//字符串长度 char str[MAXN]; int _next[MAXN]; void GetNext(char t[]) //求next数组 { int j,k,len; j=0;//从0开始,首先求_next[1] k=-1;//比较指针 _next[0]=-1;//初始值-1 len=strlen(t); while(j<len) { if(k==-1||t[j]==t[k]) //指针到头了,或者相等 { ++j; ++k; _next[j]=k;//此句可由优化替代 /*优化(求匹配位置时可用) if(t[j]!=t[k])_next[j]=k; else _next[j]=_next[k]; //*/ } else k=_next[k]; } } void KMPCount2(char t[],int N) //统计单串中从某个位置以前有多少重复的串 { int i,lent,tmp; lent=strlen(t); for(int i=2; i<=N; ++i) { tmp=i-_next[i]; if( (i%tmp==0)&&(i/tmp>1) ) { printf("%d %d\n",i,i/tmp); } } } int main() { int N; int c=0; int tmp;//最小循环节长度 while(~scanf("%d",&N)) { if(N==0)break; scanf("%s",str); GetNext(str); printf("Test case #%d\n",++c); KMPCount2(str,N); printf("\n"); } return 0; }
相关文章推荐
- 新安装Ubuntu加载时提示“为/检查磁盘时发生严重错误”的解决方法
- 程序员的年终总结
- Android 6.0 请求拨打电话error
- tcpip转
- 程序员最常见的谎话
- MapReduce:详解Shuffle过程
- 日期差值
- csr8670--button按键的实现
- 扣丁学堂——Bitmaps与优化(处理较大图片,缓存图片)
- Global Azure启用Multi-factor Authentication配置介绍
- ROS学习资料总结
- perl while continue
- Linux学习—xShell连接vmware虚拟机设置Ip
- jquery选择器扩展之样式选择器
- appcan更新
- HDU 2200 Eddy's AC难题(组合数学)
- Centos 6.5源码安装mysql_5.6.17
- linux下history命令的使用小结
- Android API Level与sdk版本对照表
- 说明