Period UVALive - 3026(KMP)
2017-11-21 18:04
423 查看
对于一段字符串来说,如果存在循环节,那么它的最小循环节一定是 ( 字符串的长度i - Next[i] ) (相当于最后一个循环节),那么直接判断(i % ( i - Next[i] ))就可以判断是不是存在循环节,还要注意Next[] > 0
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int maxn = 1000005; char str[maxn]; int Next[maxn]; int n ; void KMP() { Next[0] = 0, Next[1] = 0; for(int i = 1; i < n; i++) { int j = Next[i]; while(j && str[i] != str[j]) j = Next[j]; Next[i+1] = (str[i] == str[j] ? j+1 : 0); } } int main() { int cas = 1; while(scanf("%d", &n) == 1 && n) { scanf("%s", str); KMP(); // for(int i = 1 ;i <= n ; i++) cout << i << " " << Next[i] << endl; printf("Test case #%d\n", cas++); for(int i = 2; i <= n; i++) if(Next[i] > 0 && i % ( i - Next[i] ) == 0) printf("%d %d\n", i, i / (i - Next[i])); printf("\n"); } return 0; }
相关文章推荐
- UVALive 3026 Period ( kmp 求前缀最小循环节)
- Period UVALive - 3026(KMP)
- UVALive 3026 Period KMP 失配函数处理周期的问题
- UVALive 3026 Period (KMP上的dp,学习ac自动机的前奏)
- uvaLive 3026 - Period 水KMP循环结
- uvalive 3026 Period KMP(失配函数)
- uvalive3026 Period (KMP+结论)
- UVALive - 3026 - Period (KMP)
- UVALive 3026 (LA 3026) Period KMP求字符串周期
- UVALive 3026 Period(KMP裸)
- Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)
- uva 1328 && Live Archive 3026 Period
- uvalive 3026(kmp)
- UVALive 3026 Period (KMP算法简介)
- UVALive 3026 period(周期) kmp算法的应用
- UVALive - 3026:Period
- 【暑假】[实用数据结构]UVAlive 3026 Period
- uvalive 3026 Period (前缀最短循环节)
- UVALive - 3026 Period
- UVALive 3026(KMP)