UVaLA 3026 Period MP算法
2016-04-25 17:56
190 查看
点击打开题目链接
MP算法求失配函数
对于f [] 数组的定义如下:
1) f[j] = 0 j = 0,1
2) f[j] = max(k): 0<k<j P[0...k-1]=P[j-k,j-1]
MP算法求失配函数
对于f [] 数组的定义如下:
1) f[j] = 0 j = 0,1
2) f[j] = max(k): 0<k<j P[0...k-1]=P[j-k,j-1]
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MAXN = 1000000 + 10; char P[MAXN]; int n, f[MAXN]; //失配函数求 f 数组 void getFail() { f[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; } } int main() { int kase = 0; while (~scanf("%d", &n) && n) { scanf("%s", P); getFail(); 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; }
相关文章推荐
- KMP算法的C#实现方法
- JavaScript中数据结构与算法(五):经典KMP算法
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 字符串算法--KMP--Java实现
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207