您的位置:首页 > 其它

kmp2

2017-12-28 22:16 101 查看

kmp:如何求字符串的匹配?

题目:洛谷3375

给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。

首先,先求出s2的nxt

如果我们已经知道s1的1~i-1位能够匹配到的s2中的最大长度为j,即s1【i--1-j+1、、、j】=s2【1........j】

这时,只要枚举j的所有border——jj, 看其下一位即s2【jj+1】是否等于s1【i】,若相等则i的最大匹配为jj+1

代码如下

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
char a[1000005],b[1000005];
int c,d,e,f,g,nxt[1000005],nxt1[1000005];
int main()
{
gets(a);
gets(b);
c=strlen(a);
for(int i=c;i>=1;i--) a[i]=a[i-1];
d=strlen(b);
for(int i=d;i>=1;i--) b[i]=b[i-1];
nxt[1]=0;
for(int i=2,j=0;i<=d;i++)
{
for(;j&&b[j+1]!=b[i];j=nxt[j]);
// if(b[j+1]==b[i])
j+=b[j+1]==b[i];
nxt[i]=j;
}
int flag=0;
for(int i=1,j=0;i<=c;i++)
{
for(;j&&b[j+1]!=a[i];j=nxt[j]);
// if(b[j+1]==a[i]) j++;
j+=b[j+1]==a[i];
if(j==d)
{
cout<<i-d+1<<endl,flag=1,j=nxt[d];
}
}
if(flag==0) cout<<"no"<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kmp 模板