【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 ...
随机推荐
- Perl6 Bailador框架(2):路径设置
use v6; use Bailador; =begin pod get表示是get发送 post表示是post发送 get/post 后面的 '/name' 表示是路径 => sub {} 是 ...
- Python爬虫—破解JS加密的Cookie
前言 在GitHub上维护了一个代理池的项目,代理来源是抓取一些免费的代理发布网站.上午有个小哥告诉我说有个代理抓取接口不能用了,返回状态521.抱着帮人解决问题的心态去跑了一遍代码.发现果真是这样. ...
- 64_g5
golang-github-kr-text-devel-0-0.11.git6807e77.f..> 11-Feb-2017 07:48 14250 golang-github-kr-text- ...
- python中的enumerate获取迭代元素的下标
以前迭代的时候,需要获取次数都是如下格式: index=1 for node in nodes: if index==3: continue print(node.text_content())ind ...
- pycaffe使用.solverstate文件继续训练
import caffe solver_file = "solver.prototxt" solverstate = "xx.solverstate" caff ...
- HIbernate学习笔记3 之 缓存和 对象的三种状态
一.hibernate一级缓存 * hibernate创建每个Session对象时,都会给该Session分配一块独立的缓冲区,用于存放Session查询出来的对象,这个分配给session的缓存区 ...
- django-1366, "Incorrect string value: '\\xE6\\x88\\x9A\\xE4\\xBC\\x9F...'
今天把之前的一些代码转移到另外一台电脑的时候, python manage.py syncdb 的时候报了 (1366, "Incorrect string value: '\\xE6\\x ...
- LockSupport学习
LockSupport工具类定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能.Java锁和同步器框架的核心工具类AQS:AbstractQueueSynchronizer,就是通过调 ...
- 数据库之各种键(Key)
超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键候选键(candidate key):不含有多余属性的超键称为候选键主键(primary key):用户选作元组标识的一个候 ...
- 如何简单的测试kubernetes的dns add-ons是否工作正常?
1,新建一个yaml文件. apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: ...