zoukankan      html  css  js  c++  java
  • 【字符串】跳来跳去的KMP匹配

    原理:

    不给予证明啦(懒得一批

    但是代码中有给还算详细的注释

    参考:https://www.cnblogs.com/yjiyjige/p/3263858.html

    模板题:

    洛谷P3375:

    https://www.luogu.org/problemnew/show/P3375

    代码:

    #include<iostream>
    #include<cstring>
    #define MAXN 1000010
    using namespace std;
    char a[MAXN],b[MAXN];
    int next[MAXN];
    int la,lb,j; //j为所匹配到的最大的后缀的前缀最后一位 
    int main()
    {
        cin>>a+1;//从一开始存 
        cin>>b+1;
        la=strlen(a+1);
        lb=strlen(b+1);
        for(int i=2;i<=lb;i++)//匹配匹配串 
        {
            while(j&&b[j+1]!=b[i])//判j不为零因为在第一位就不用往前找了
                                  //如果不匹配就往前找 
            j=next[j];
            if(b[j+1]==b[i])//匹配就往下推 
            j++;
            next[i]=j;
        }
        j=0;
        for(int i=1;i<=la;i++)//匹配文本串 同上 
        {
            while(j&&b[j+1]!=a[i])
            j=next[j];
            if(b[j+1]==a[i])
            j++;
            if(j==lb)//找到一个匹配串输出位置 
            cout<<i-lb+1<<endl;
        }
        for(int i=1;i<=lb;i++)
        cout<<next[i]<<" ";
    }
    View Code

    后记:

    培训D2T3考到了KMP

    上午也有讲思路

    但是身为蒟蒻会思路不会代码啊

    直接放弃了T3打前面的两题

    晚上又花了一点时间理解

    打完了这个板子

  • 相关阅读:
    数组
    mysql优化思路
    mysql_存储过程
    mysql_函数
    mysql_结构
    mysql_触发器
    mysql_变量
    mysql_事务
    mysql总结
    mysql备份
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9278288.html
Copyright © 2011-2022 走看看