【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 ...
随机推荐
- pandas中DataFrame使用
切片选择 #显示第一行数据print(df.head(1)) #显示倒数三行数据 print(df.tail(3)) loc df.loc[row_index,col_index] 注意loc是根 ...
- 纠结于arch+xfce还是xubuntu
现在用的是ubuntu gnome版 http://www.tuicool.com/articles/6r22eyU 现在纠结于arch+xfce还是xubuntu,因为不想在gnome下面搞什么美化 ...
- 【转】MP3文件原理及结构解析
1.引言文件压缩技术的日新月异使得MP3成为时下最烫手的音乐格式,优质的音乐随着0与1的排列迅速散布 到世界各地,撼动人心.何谓MP3?MP3的全称是MPEG Audio Layer 3,它是一种高效 ...
- 通过JDBC连接HiveServer2
如果通过JDBC连接HiveServer2时提示:User: hive is not allowed to impersonate hive,需要在core-site.xml中新增如下配置: hado ...
- 【bzoj1798】【AHOI2009】维护序列
练一下线段树模板,区间乘法. #include<bits/stdc++.h> #define lson (o<<1) #define rson (o<<1|1) ; ...
- 运输层和TCP/IP协议
0. 基本要点 运输层是为相互通信的应用进程提供逻辑通信. 端口和套接字的意义 什么是无连接UDP 什么是面向连接的TCP 在不可靠的网络上实现可靠传输的工作原理,停止等待协议和ARQ协议 TCP的滑 ...
- C#ActiveX安装项目
C#开发的ActiveX控件发布方式有三种: 制作客户端安装包,分发给客户机安装: 制作在线安装包,客户机联机安装: 使用html中object的codebase指向安装包地址. 以下为制作安装包: ...
- 初学jmeter
jmeter安装的前提需要有jdk环境,下载安装好jdk环境后记得要设置好环境变量. 配置环境变量:右击“我的电脑”-->"高级"-->"环境变量" ...
- Leetcode 之Largest Rectangle in Histogram(40)
又是一道构思巧妙的题,暴力求解复杂度太高,通过构造一个递增栈来解决:如果当前元素小于栈顶元素,则说明栈内已经构成一个 递增栈,则分别计算以每个元素为最低值的面积:反之,则入栈. int largest ...
- HDU-5281
Senior's Gun Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...