【KMP求最小周期】POJ2406-Power Strings
【题意】
给出一个字符串,求出最小周期。
【思路】
对KMP的next数组的理解与运用orz
①证明:如果最小周期不等于它本身,则前缀和后缀必定有交叉。
如果没有交叉,以当前的next[n]为最小周期, 中间部分可能会小于next[n](无解),或者中间可能由若干个前缀组成,此时next[n]会变大,舍去!
-----------------------
-----------------------
②证明:假设满足了n%(n-next[i])==0,那么n-next[i]是周期
这部分证明直接引用这里的:http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html
-----------------------
-----------------------
k m x j i
由上,next【i】=j,两段红色的字符串相等(两个字符串完全相等),s[k....j]==s[m....i]
设s[x...j]=s[j....i](xj=ji)
则可得,以下简写字符串表达方式
kj=kx+xj;
mi=mj+ji;
因为xj=ji,所以kx=mj,如下图所示
-------------
-------------
k m x j
看到了没,此时又重复上面的模型了,kx=mj,所以可以一直这样递推下去
③证明:n%(n-next[n])是最小的周期。
红色的部分为n-next[n]。假设存在一个小于(n-next[n])的最小周期,假设为绿色部分。由于后面的部分都是在不断循环绿色部分,则下方的橙色部分必定是原串的一个前缀。而原串的next[n]长度等于后缀等于紫色部分,相反小于橙色部分,与next[n]的定义矛盾。
---------------------
---------------------
得证:如果n%(n-next[n])==0,则最小周期为(n-next[n]),否则就是它本身。
一整个下午复习了KMP的裸体然后证明这个证明到现在……果然还是没有领悟KMP的精髓。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=+;
char str[MAXN];
int next[MAXN]; int getnext(int len)
{
int i=,j=-;
next[i]=j;
while (i<len)
{
if (j==- || str[i]==str[j]) next[++i]=++j;
else j=next[j];
}
return next[len];
} int main()
{
while (scanf("%s",str))
{
if (str[]=='.') break;
int len=strlen(str);
int T=len-getnext(len);
if (len%T==) cout<<len/T<<endl;
else cout<<<<endl;
}
return ;
}
【KMP求最小周期】POJ2406-Power Strings的更多相关文章
- POJ2406 Power Strings —— KMP or 后缀数组 最小循环节
题目链接:https://vjudge.net/problem/POJ-2406 Power Strings Time Limit: 3000MS Memory Limit: 65536K Tot ...
- poj2406 Power Strings(kmp)
poj2406 Power Strings(kmp) 给出一个字符串,问这个字符串是一个字符串重复几次.要求最大化重复次数. 若当前字符串为S,用kmp匹配'\0'+S和S即可. #include & ...
- [KMP求最小循环节][HDU1358][Period]
题意 求所有循环次数大于1的前缀 的最大循环次数和前缀位置 解法 直接用KMP求最小循环节 当满足i%(i-next[i])&&next[i]!=0 前缀循环次数大于1 最小循环节是i ...
- poj2406 Power Strings (kmp 求最小循环字串)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 47748 Accepted: 19902 ...
- E - Power Strings,求最小周期串
E - Power Strings Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- KMP + 求最小循环节 --- POJ 2406 Power Strings
Power Strings Problem's Link: http://poj.org/problem?id=2406 Mean: 给你一个字符串,让你求这个字符串最多能够被表示成最小循环节重复多少 ...
- poj2406 Power Strings(kmp失配函数)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 39291 Accepted: 16315 Descr ...
- poj2406--Power Strings(KMP求最小循环节)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 33178 Accepted: 13792 D ...
- kuangbin专题十六 KMP&&扩展KMP POJ2406 Power Strings
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...
随机推荐
- Cordova入门
创建你的第一个App 因为对接要对接酷音,实现h5跨平台调用客户端的保存和分享功能,所以学了下cordova的入门. 安装Cordova CLI Cordova命令行工具作为npm包分发. 安装cor ...
- PKUWC 2019 自闭记
PKUWC 2019 自闭记 Day -1 考前天天在隔壁的物竞教室划水(雀魂,能和吉老师一起玩的游戏都是好游戏),没有做题. Day 0 早上8:16的高铁,到广州南居然要6个小时...不知道福州和 ...
- python基础===Windows环境下使用pip install 安装出错"Cannot unpack file"解决办法
不知道为什么,加了豆瓣镜像源还是不行 这个命令可以解决! pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douba ...
- Oracle 表连接方式
1.嵌套循环联结(NESTED LOOPS)2.哈希联结(HASH JOIN)3.排序合并联结(MERGE JOIN)4.半联结(in/exists)5.反联结(not in/not exists)6 ...
- 算法题之Median of Two Sorted Arrays
这道题是LeetCode上的题目,难度级别为5,刚开始做没有找到好的思路,以为是自己智商比较低,后来发现确实也比较低... 题目: There are two sorted arrays nums1 ...
- 文件上传实现ajax假异步
$.ajaxFileUpload({ url : getSitePath()+'/jlyElderly/doUpdateImage', secureuri : false,//是否需要安全协议 fil ...
- 步骤一:下载jdk并安装和配置java环境变量
1.下载JDk地址: http://download.eclipse.org/oomph/jre/?vm=1_1_7_0_64_0 2.进入下载页面(下载的是jdk7),点击:Oracle JDK1. ...
- 使用cmd(黑窗口)敲命令使用远程数据库
C:\Users\gzz>mysql -h 10.27.104.176 -u root -p mysql
- Java Socket编程基础篇
原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...
- NYOJ 116 士兵杀敌二
士兵杀敌(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常 ...