KMP字符串匹配(模板)

描述:

  给出两个字符串 s1 和 s2 ,其中 s2 为 s1 的子串,求出 s2 在 s1 中所有出现的位置。同时要求输出 s2 的 fail 数组。

思路:

  KMP模板。

标程:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1000001
char s1[maxn],s2[maxn];
int fail[maxn];
int ans[maxn],cnt;
int len1,len2,j=0;
inline void get()
{
    for(int i=2;i<=len2;i++)
    {
        while(j&&s2[i]!=s2[j+1])    j=fail[j];//不能继续匹配且j还没有减到0,考虑退一步 
        if(s2[i]==s2[j+1])    j++;//能匹配,j的值+1 
        fail[i]=j;
    }    
}
inline void kmp()
{
    j=0;
    for(int i=1;i<=len1;i++)
    {
        while(j>0&&s1[i]!=s2[j+1])    j=fail[j];//不能继续匹配且j还没减到0,减小j的值 
        if(s1[i]==s2[j+1])    j++;//能继续匹配j,j的值+1 
        if(j==len2)//找到一处匹配 
        {
            ans[++cnt]=i-len2+1;//记录位置 
            j=fail[j];//往后跳,继续找 
        }
    }
}
int main()
{
    scanf("%s",s1+1);
    scanf("%s",s2+1);
    len1=strlen(s1+1);
    len2=strlen(s2+1);
    get();
    kmp();
    for(int i=1;i<=cnt;i++)
        printf("%d\n",ans[i]);//输出s2在s1中出现的位置 
    for(int i=1;i<=len2;i++)
        printf("%d ",fail[i]);//输出fail数组 
return 0;
}

猜你喜欢

转载自www.cnblogs.com/lck-lck/p/9714789.html