Period UVALive - 3026(KMP)
2017-05-04 23:48
411 查看
Period(传送门)
题意给定字符串,找到每个前缀的最大循环节的个数,即循环周期,如果大于
1的话就输出下标和周期数(循环节)
解题思路
KMP就可以非常轻松的解决问题,首先提到一个
next数组的性质,对于当前的前缀
a[j],如果
j % (j - next[j]) == 0则
j - next[j]即为最小周期长度,而周期数就是
j / (j - next[i]),至于为什么
j - next[j]为最小周期长度呢,请听我慢慢徐来,先看下面的示意图
通过看这幅图大家或许也能看懂,我就稍微讲述一下,我们当前失配了
j点,然后我们需要调到
next[j],那我们知道
1子串和
2子串必须是相等的,就是公共后缀子串。
所以从
j开始往
0走的方向上,第一个长度为
k和第二个长度为
k的字符串是相等的。又因为
w == w(因为
1==2并且长度为
k的后缀字符串也是相等的),所以
w字符串的后缀长度为
k的字符串等于以
j和
next[j]为结尾长度为
k的后缀字符串。
以此类推,只要我们的
j % (j - next[j])为
0就可以保证从
j往前走有
j / (j - next[j])个长度为
j - next[j]的字符串相等。
如此,证明完毕,如果不懂滴,可以留言。
代码
#include <iostream> #include <fstream> #include <string> #include <map> #include <set> #include <algorithm> using namespace std; typedef long long LL; constexpr int MAXN = 2e6 + 5; constexpr int MAXM = 4e4 + 5; constexpr int mod = 20071027; string b; int n,nexts[MAXN]; void getNext(string a) { int k = nexts[0] = -1; int j = 0; while(j < a.length()) { if(k == -1 || a[j] == a[k]) { j ++; k ++; nexts[j] = k; } else { k = nexts[k]; } } } int main() { ios::sync_with_stdio(false); //ifstream in("input.txt"); //cin.rdbuf(in.rdbuf()); int cas = 1; while(cin >> n && n) { cin >> b; getNext(b); cout << "Test case #" << cas ++ << endl; for(int i = 0; i <= n; i ++) { if(i && i % (i - nexts[i]) == 0 && i / (i - nexts[i]) > 1) { cout << i << " " << i / (i - nexts[i]) << endl; } } cout << endl; } return 0; }
相关文章推荐
- UVALive 3026 Period(KMP裸)
- Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)
- UVALive 3026 Period KMP 失配函数处理周期的问题
- UVALive - 3026 - Period (KMP)
- Period UVALive - 3026(KMP)
- UVALive 3026 Period (KMP上的dp,学习ac自动机的前奏)
- uvaLive 3026 - Period 水KMP循环结
- uvalive 3026 Period KMP(失配函数)
- uvalive3026 Period (KMP+结论)
- UVALive 3026 (LA 3026) Period KMP求字符串周期
- UVALive 3026 Period ( kmp 求前缀最小循环节)
- uvalive 3026(kmp)
- UVALive - 3026 Period
- UVALive 3026 period(周期) kmp算法的应用
- UVALive 3026 Period (KMP算法简介)
- UVALive 3026(KMP)
- [UVALive3026] Period && 字符串
- 【暑假】[实用数据结构]UVAlive 3026 Period
- UVALive - 3026:Period
- 【暑假】[实用数据结构]UVAlive 3026 Period