KMP
2018-01-26 19:37
141 查看
简介
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息(百度百科)。
个人理解
在进行字符串匹配时, 直接暴力会在字符串某个字符串不匹配时重回字符串首部, 这样就丢失了已经匹配了的信息, 而KMP算法用next数组记录了模式串的信息,提高了效率。next 数组记录的模式串信息是已经匹配了的字符串的最长前缀和最长后缀的位置。
next数组获取
匹配函数
题目
1.剪花布条
题目链接
题目大意
给定字符串, 找出某个模式串在主串中出现了几次。
思路
从头开始匹配, 模式串到头的时候计数加一, 整个主串匹配完后输出计数变量sum
2.Count the string
题目链接
给定字符串, 求每个前缀在整个字符串中主线了几次, 输出和
思路
KMP算法中, next数组记录了前缀和后缀匹配的位置, next数组某元素中每跳转一次意味着字符中有某个子串与某前缀相同, 因此记录跳转的次数就能得出结果。
代码
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息(百度百科)。
个人理解
在进行字符串匹配时, 直接暴力会在字符串某个字符串不匹配时重回字符串首部, 这样就丢失了已经匹配了的信息, 而KMP算法用next数组记录了模式串的信息,提高了效率。next 数组记录的模式串信息是已经匹配了的字符串的最长前缀和最长后缀的位置。
next数组获取
void Getne (char *a) { int i=0, j=-1; ne[0]=-1; int len = strlen(a); while (i<len ) { if(j==-1 || a[i]==a[j]) ne[++i]=++j; // j 记录前缀后缀匹配的数量 else j=ne[j]; } }
匹配函数
void Kmp(char *a, char *b) { int lena = strlen(a); int lenb = strlen(b); int i = 0, j = 0; while(i < lena && j < lenb) { if(j == -1 || a[i] == b[j]) { i++; j++; } else j = ne[j]; } if(j == lenb) return i - j + 1; else return -1; }
题目
1.剪花布条
题目链接
题目大意
给定字符串, 找出某个模式串在主串中出现了几次。
思路
从头开始匹配, 模式串到头的时候计数加一, 整个主串匹配完后输出计数变量sum
2.Count the string
题目链接
给定字符串, 求每个前缀在整个字符串中主线了几次, 输出和
思路
KMP算法中, next数组记录了前缀和后缀匹配的位置, next数组某元素中每跳转一次意味着字符中有某个子串与某前缀相同, 因此记录跳转的次数就能得出结果。
代码
#include<cstdio> #include<cstring> using namespace std; int ne[200005]; void Getne(char *a) { int i=0, j=-1; int len=strlen (a); ne[0]=-1; while(i< len) { if(j==-1 || a[i]==a[j]) ne[++i]=++j; else j=ne[j]; } } int main () { long long t, n, ans, m; char a[200005]; scanf("%lld", &t); for(int i=0; i<t; i++) { scanf ("%lld", &n); scanf("%s", a); ans=0; Getne(a); while(n!=0) { m=n; while(m!=0) { ans++; ans=ans%10007; m=ne[m]; } n--; } printf("%d\n", ans%10007); } return 0; }
相关文章推荐
- KMP的个人理解
- KMP模式匹配算法
- hdu - 4333 - Revolving Digits - 扩展kmp
- KMP模式匹配算法C++实现
- poj 2406 Power Strings[kmp,next数组的应用]
- KMP模板
- KMP
- Codeforces Round #344 (Div. 2) D. Messenger(kmp)
- poj3461 kmp 模板题
- KMP模板
- 今天写了一个KMP匹配算法,写好后发现用于拼音匹配时不合适,暂存一下吧
- poj 1572 kmp
- hdu2595(kmp)
- POJ 3461 Oulipo KMP模板题
- hdu1876 KMP
- (模板题)sdut 2125 数据结构实验之串二:字符串匹配(KMP)
- 【KMP变形求公共子串】HDU 1867——A+B for U again
- POJ 2406 Power Strings (kmp求循环节)
- HDU 1867 KMP
- poj 2406 KMP求循环节