UVALive 3026 period(周期) kmp算法的应用
来源:互联网 发布:单片机串口通信原理 编辑:程序博客网 时间:2024/06/05 23:32
周期
给定一个长度为n的字符串S,求它的每个前缀的最短循环节,换句话说,对于每个i,i属于2到n,求一个最大的整数K>1(如果K存在)使得S的前i个字符组成的前缀是某个字符串重复K次得到的。输出所有存在K的i和对应的K。
样例输入:
12
aabaabaabaab
3
aaa
样例输出:
Test case #1
解题思路:
这题的要求对Kmp算法有比较熟练的掌握。
对于kmp算法,每次匹配出现错误的时候,他会转移到一个之前的一个状态
这个状态保存在失配函数中(其实就是一个数组)
那么分析这个失配函数
对于例子:aabaabaabaab
处理之后
01234567891011aabaabaabaab001012345678
第一行是字符串的字符的位置
第二行是字符
第三行是失配函数
那么分析位置2如果这里发生失配了,要转移到位置1,那么意味着k[1..1] = k[0..0]
接下来分析位置6如果这里发生失配了,要转移到位置3,那么意味着k[3..5] = k[0..2]
再来分析位置9如果这里发生失配了,要转移到位置6,那么意味着k[6..8]=k[3..5] ; k[3..8] = k[0..5]
那么仔细观察会发现:失配的位置i减去要转移的位置f[i]就是循环节的长度,那么就要看看,这个循环节的长度是不是能完全覆盖长度i
即i%(i-f[i])是不是等于0的就可以了,如果等于0就意味着我们找到了这个循环节。
样例输入:
12
aabaabaabaab
3
aaa
样例输出:
Test case #1
2 2
6 2
9 3
12 4
Test case #2
2 2
3 3
Test case #2
2 2
3 3
解题思路:
这题的要求对Kmp算法有比较熟练的掌握。
对于kmp算法,每次匹配出现错误的时候,他会转移到一个之前的一个状态
这个状态保存在失配函数中(其实就是一个数组)
那么分析这个失配函数
对于例子:aabaabaabaab
处理之后
01234567891011aabaabaabaab001012345678
第一行是字符串的字符的位置
第二行是字符
第三行是失配函数
那么分析位置2如果这里发生失配了,要转移到位置1,那么意味着k[1..1] = k[0..0]
接下来分析位置6如果这里发生失配了,要转移到位置3,那么意味着k[3..5] = k[0..2]
再来分析位置9如果这里发生失配了,要转移到位置6,那么意味着k[6..8]=k[3..5] ; k[3..8] = k[0..5]
那么仔细观察会发现:失配的位置i减去要转移的位置f[i]就是循环节的长度,那么就要看看,这个循环节的长度是不是能完全覆盖长度i
即i%(i-f[i])是不是等于0的就可以了,如果等于0就意味着我们找到了这个循环节。
#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int maxn = 1000005 ;char p[maxn] ;int f[maxn] ;int main(){ int n,kase=0 ; while(scanf("%d",&n),n){ scanf("%s",p); f[0] = 0 ; f[1] = 0 ; for(int i = 1 ;i<n ;i++){ int j = f[i] ; while(j&&p[i]!=p[j])j=f[j] ; f[i+1] = (p[i] == p[j]?j+1:0 ); } printf("Test case #%d\n",++kase); for(int i = 2;i<=n;i++){ if(f[i]>0 && i%(i-f[i])==0){ printf("%d %d\n",i,i/(i-f[i])); } } printf("\n"); } return 0;}
0 0
- UVALive 3026 period(周期) kmp算法的应用
- UVALive - 3026 - Period (KMP)
- UVALive 3026 (LA 3026) Period KMP求字符串周期
- UVAlive 3026 Period [KMP]
- UVALIVE 3026 Period(kmp)
- uvalive 3026 Period KMP(失配函数)
- UVALive 3026 Period(KMP裸)
- HDU 1358 Period(KMP算法应用)
- uva 1328 - Period (周期串的判断 kmp)
- Period(KMP算法)
- Period(KMP算法)
- HDU 1358 Period (kmp求周期)
- poj 1961 Period(KMP求周期)
- poj1961—Period(kmp周期性质)
- hdu1358 Period(kmp周期)
- uvaLive 3026 - Period 水KMP循环结
- hdu oj Period (kmp的应用)
- 【kmp算法next数组-串的最小循环节/循环周期】Period HDU
- 给EventBus增加订阅收到消息提醒,用AndroidStudio重新打包成Jar文件
- LinkedHashMap和HashMap的区别以及使用方法
- for 语句
- Android Studio中“非法字符\\65279,Error:(1, 10) 错误: 需要class, interface或enum”
- Part3:关联容器(二)&Part4:迭代器
- UVALive 3026 period(周期) kmp算法的应用
- Java技术内幕
- 2016.07.16【初中部 NOIP提高组 】模拟赛C总结
- 杭电OJ1008-电梯Elevator
- 树状数组点修改+段求值
- andriod开发中的几个基本概念及关系SDK ADT Platform API
- python网络爬虫实例(一):爬取糗事百科
- 2016.7.15_模拟赛t1 立方体
- 什么是ANR 如何避免它