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;
}
相关文章推荐
- hdu 1711(KMP)
- HDU - 1711 - Number Sequence (KMP)
- 寒假前刷题(3)kmp系列 hdu 2203
- POJ 2406 KMP next数组的应用
- hdu 1171 史上最裸KMP
- POJ 2752 (KMP)
- HDU 2203 亲和串 (KMP)
- hdu 1686 kmp(求子串出现个数)
- KMP / hdu 1711 [找到匹配的位置并返回]
- KMP
- poj2752 kmp 进一步运用
- HDU1711 Number Sequence KMP基础
- Period hdu1358 KMP
- 2016夏季练习——KMP
- 字符串匹配算法KMP
- kmp从入门到放弃
- 二进制的KMP
- HDU-5763-Another Meaning(KMP+DP)
- KMP求next
- KMP