zoukankan      html  css  js  c++  java
  • HDU 1686 Oulipo(KMP)题解

    题意:主串中能找到几个模式串

    思路:超详细解释KMP

    KMP:针对这个代码,解释一下Fail数组的含义:T为主串,P为模式串,Fail代表失配值,即当P[j] != T[i]时,j要指向的位置为Fail[j],当Fail为-1时表示i指针后移。如果使用这个代码,Fail[j]的值的含义为P[0]…P[j-1]这个子串的前后缀匹配度,但是下面代码的不是!!!

    代码:

    #include<iostream>
    #include<algorithm>
    const int N = 1000000+5;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    int fail[N];
    char p[N],t[N];
    void getFail(){
         fail[0] = -1;
         int j = 0,k = -1;
         int len = strlen(p);
         while(j < len){
            if(k == -1 || p[j] == p[k]){
                if(p[++j] == p[++k])    //两个字符相等时跳过
                    fail[j] = fail[k];
                else
                    fail[j] = k;
            }
            else{
                k = fail[k];
            }
         }
    }
    int KMP(){
        int num = 0;
        getFail();
        int i = 0,j = 0;    //主串位置和模式串位置
        int lent = strlen(t),lenp = strlen(p);
        while(i < lent){
            if(j == -1 || t[i] == p[j]){    //当j为-1时要移动i,j归零
                i++;
                j++;
                if(j == lenp) num++;
            }
            else{
                j = fail[j];    //失配,j回到指定位置
            }
        }
        return num;
    }
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            scanf("%s%s",p,t);
            int ans = KMP();
            printf("%d
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    elasticsearch api
    kaili camera
    mysql create db utf8 character
    npm run-script
    d-link kvm 关闭声音
    setInterval js
    jpa datasource config
    mvn添加本地jar
    Sublime Text 2 中文包
    初遇ping++
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9408777.html
Copyright © 2011-2022 走看看