POJ 1961 Period KMP算法之next数组的应用
2013-08-06 20:21
363 查看
题意:给一个长度为n的字符串,如果它长度为l(2 <= l <= n)的前缀部分是由一些相同的字符串相接而成,输出前缀的长度l和长度为l时字符串重复的最大次数。
例如字符串为: aaaba。对于长度为2的前缀"aa"来说, “aa”最多由两个‘a’连接而成。对于长度为3的前缀"aaa"来说,“aaa”最多由三个'a'连接而成。
思路:该问题恰好用到了next数组的特性。
在kmp算法中,当字符串匹配失败时,next数组给出模式串接下来要匹配的位置。它的目的在于尽可能得利用模式串的特征少往回退。
假如匹配失败的位置为j,则对于S[0]S[1]S[2]...S[j-1]都是匹配成功的。现如果有一个最大的k,且满足S[0]S[1]S[2]...S[k-1]与S[j-k]S[j-k+1]...S[j-1]相同,则可知接下来应当将模式串的S[k]与主串匹配,即next[j] = k。
考虑该题情况,如果长度为l的前缀是由字符串重复构成的,则next[l] != 0(由上面k的定义可知),且此时构成前缀的重复子串的最小长度为l - next[l],l % (l - next[l]) = 0,最大重复次数为l / (l - next[l])。
例如字符串为: aaaba。对于长度为2的前缀"aa"来说, “aa”最多由两个‘a’连接而成。对于长度为3的前缀"aaa"来说,“aaa”最多由三个'a'连接而成。
思路:该问题恰好用到了next数组的特性。
在kmp算法中,当字符串匹配失败时,next数组给出模式串接下来要匹配的位置。它的目的在于尽可能得利用模式串的特征少往回退。
假如匹配失败的位置为j,则对于S[0]S[1]S[2]...S[j-1]都是匹配成功的。现如果有一个最大的k,且满足S[0]S[1]S[2]...S[k-1]与S[j-k]S[j-k+1]...S[j-1]相同,则可知接下来应当将模式串的S[k]与主串匹配,即next[j] = k。
考虑该题情况,如果长度为l的前缀是由字符串重复构成的,则next[l] != 0(由上面k的定义可知),且此时构成前缀的重复子串的最小长度为l - next[l],l % (l - next[l]) = 0,最大重复次数为l / (l - next[l])。
#include<stdio.h> #define maxn 1000010 char str[maxn]; int next[maxn], len; void get_next() { next[0] = -1; int i = 0; int j = -1; while (i < len) { if (j == -1 || str[i] == str[j]) { i++; j++; next[i] = j; } else j = next[j]; } } int main() { int cas = 1; while (scanf("%d", &len) && len) { scanf("%s", str); get_next(); printf("Test case #%d\n", cas++); for (int i = 2; i <= len; i++) if (next[i] && i % (i - next[i]) == 0) printf("%d %d\n", i, i / (i - next[i])); printf("\n"); } return 0; }
相关文章推荐
- POJ 1961 Period KMP算法next数组的应用
- poj 1961 Period 【KMP-next前缀数组的应用】
- POJ 1961 Period KMP(next数组应用)
- POJ 1961 Period KMP next数组的应用
- poj 1961 Period (kmp next 数组的应用)
- Poj-1961 Period(next数组应用)
- poj 1961 Period(未优化KMP的next数组)
- POJ 1961 Period(next数组求循环节)
- LA 3026 && POJ 1961 Period (利用kmp中的next数组找最小的循环节 )
- POJ 2406 Power Strings 1961的简化版,kmp的next数组的应用
- POJ - 1961 Period解题报告(kmp next数组巧用)
- poj 1961 Period [kmp, next数组的用法]
- POJ - 2406_Power Strings _kmp算法next数组的应用
- POJ 2752 KMP算法中next数组的应用
- POJ - 1961 Period(next数组求循环节)
- POJ 1961 Period(KMP next数组巧用)
- POJ 1961 Period 还是next数组的含义、
- hdu 1358:Period(KMP算法,next[]数组的使用)
- POJ2752 KMP中next数组的应用
- KMP算法Next数组的应用