KMP模板

#include<bits/stdc++.h>
using namespace std;
int next[1000010],n,l1,l2;
char s1[1000010],s2[1000010];
vector<int> res;
void get_next(char *s)
{
	next[0]=next[1]=0;
	int len=strlen(s+1);
	for(int i=2,j=0;i<=len;i++)
	{
		while(j&&s[i]!=s[j+1])	j=next[j];
		if(s[j+1]==s[i])	j++;
		next[i]=j;
	}
}
void kmp()
{
	get_next(s2);
	for(int i=1,j=0;i<=l1;i++)
	{
		while(j&&(j==n||s1[i]!=s2[j+1]))	j=next[j];
		if(s1[i]==s2[j+1])	j++;
		if(j==l2)	res.push_back(i-j+1),j=next[j];
	}
}
int main()
{
	scanf("%s %s",s1+1,s2+1);
	l1=strlen(s1+1),l2=strlen(s2+1);
	kmp();
	for(int i=0;i<res.size();i++)	cout<<res[i]<<endl;
	for(int i=1;i<=l2;i++)	cout<<next[i]<<' ';
	cout<<endl;
	return 0;
}
全部评论

相关推荐

鼠鼠第一次实习,啥也不懂一直是自己一个人吃的饭,不会做工作老是被嫌弃,大人的世界是这样的吗?
我是星星我会发亮:好的mt有两种,一种愿意教你的,一种几乎什么活都不给你派让你很闲允许你做自己事情的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务