ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

KMP模板

2021-05-29 21:08:09  阅读:131  来源: 互联网

标签:标号 int KMP char maxn kmp include 模板


打ACM的时候又碰到了kmp,就翻了翻以前的博客
怎么说呢,感觉以前写的好烂啊,全是一些感性的理解,没有任何严格的证明,而且代码不是很简洁。
所以这里推荐还是看书吧,比如李煜东的《算法竞赛进阶指南》就讲的很好,而且代码写的很精炼,我觉得如果我写这篇文章的话,也只不过是把书上的话复述一遍,所以这里我就贴一个代码吧。


kmp推荐字符串从1开始标号,因为当f[i]=0的时候表示在模板串的当前位置,没有任何一个前缀能和对应的后缀匹配上,但如果从0开始标号的话就会引起歧义。
题目就是洛谷的kmp板子

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e6 + 5;

char s[maxn], s2[maxn];

int f[maxn];
void kmp_init(char* s)
{
	int n = strlen(s + 1); f[1] = 0;
	for(int i = 2, j = 0; i <= n; ++i)
	{
		while(j && s[j + 1] != s[i]) j = f[j];
		if(s[j + 1] == s[i]) ++j;
		f[i] = j;
	}
}
void kmp(char* t, char* p, int* f)
{
	int n = strlen(t + 1), m = strlen(p + 1);
	for(int i = 1, j = 0; i <= n; ++i)
	{
		while(j && (j == m || t[i] != p[j + 1])) j = f[j];
		if(t[i] == p[j + 1]) ++j;
		if(j == m) printf("%d\n", i - j + 1);
	}
}

int main()
{
	scanf("%s%s", s + 1, s2 + 1);
	kmp_init(s2), kmp(s, s2, f);
	int m = strlen(s2 + 1);
	for(int i = 1; i <= m; ++i) printf("%d ", f[i]); puts("");
	return 0;
}

标签:标号,int,KMP,char,maxn,kmp,include,模板
来源: https://blog.51cto.com/u_15234622/2831605

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有