[poj2406]Power Strings(kmp求最小循环节)
2016-02-19 19:19
302 查看
题目描述
传送门题解
最小循环节=长度-末位失配条件:1、末位失配的长度大于等于整个字符串长度的一半;
2、循环节长度可以被字符串长度整除。
假设黑色的部分为原始的字符串,蓝色的部分为末位失配,红色的部分为长度-末位失配,我们可以知道相同颜色的部分分别对应相等,意思类推,得出上面的结论。
但是要注意判断循环节长度能否被总长度整除。这道题的话直接判断能否整除不判断失配长度是否超过一半其实也是可以过的,因为如果失配长度不超过一半,总长度-失配长度一定超过一半,那么一定不能整除,循环节还是为它本身。
代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int max_W=1000005; char W[max_W]; int T[max_W],len,mid,ans; inline void calc_T(){ T[0]=-1; int j; for (int i=0;i<len;++i){ j=T[i]; while (j!=-1&&W[i]!=W[j]) j=T[j]; T[i+1]=++j; } } int main(){ while (gets(W)){ len=strlen(W); if (len==1&&W[0]=='.') break; memset(T,0,sizeof(T)); calc_T(); if (len%2==0) mid=len/2; else mid=len/2+1; if (T[len]>=mid&&len%(len-T[len])==0) ans=len/(len-T[len]); else ans=1; printf("%d\n",ans); } }
相关文章推荐
- iOS开发之网络编程--6、NSURLSessionConfiguration笔记
- cudnn 安装说明
- 由Actvity启动模式之SingleInstance引起的坑的反思
- 安卓studio导入项目步骤详解
- mybatis防止sql注入
- CSS清除浮动常用方法小结
- zoj 3656 2-sat 不错的题
- 生活的大门向你敞开……
- iOS旧项目升级WatchOS2.0时遇到的问题
- 我来试试视频功能
- Typescript学习笔记(一)基础类型
- 黑马程序员——Java内存结构
- 一份面试题的总结 1
- iOS开发-编译使用动态库
- uboot环境变量实现分析
- C++字符串类
- hdu4540 威威猫系列故事——打地鼠(简单DP)
- 节后第一天上班
- jstack命令使用
- CSS之BFC详解