zoukankan      html  css  js  c++  java
  • 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
    ",ans[i]);//输出s2在s1中出现的位置 
        for(int i=1;i<=len2;i++)
            printf("%d ",fail[i]);//输出fail数组 
    return 0;
    }
  • 相关阅读:
    windows 根据端口查看进行PID 并杀掉进程
    Linux下安装mysql-5.7
    springcloud参考视频和源码笔记
    idea中配置热部署
    技术/方案实现目录
    系统功能设计产出模版
    JQuery点击行tr实现checkBox选中与未选中切换
    Java学习第一天
    ES6 记录
    微信小程序记录
  • 原文地址:https://www.cnblogs.com/lck-lck/p/9714789.html
Copyright © 2011-2022 走看看