zoukankan      html  css  js  c++  java
  • 字符串——KMP

    这里提供数字版KMP和字符串版KMP

    点击查看代码块
    #include <bits/stdc++.h>
    
    #define ed end()
    #define bg begin()
    #define mkp make_pair
    #define pb push_back
    #define vv(T) v(v(T))
    #define v(T) vector<T>
    #define all(x) x.bg,x.ed
    #define newline puts("")
    #define si(x) ((int)x.size())
    #define rep(i,n) for(int i=1;i<=n;++i)
    #define rrep(i,n) for(int i=0;i<n;++i)
    #define srep(i,s,t) for(int i=s;i<=t;++i)
    #define drep(i,s,t) for(int i=t;i>=s;--i)
    
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    const int maxn = 1e6+10;
    const int inf = 0x7f7f7f7f;
    const ll inf_ll = 1ll*inf*inf;
    const int Mod = 1e9+7;
    const double eps = 1e-7;
    int n,m;
    int nxt[maxn];
    //字符串版本kmp
    int kmp(char *s,int len1,char *t,int len2) {//t是模式串,s是匹配串
        int ans=0;//ans记录t串在s串中出现的次数
        int i,j;
        nxt[0]=nxt[1]=0;
        for(i=2,j=0;i<=len2;i++){
            while(j && t[j+1]!=t[i]) j=nxt[j];
            if(t[j+1] == t[i]) ++j;
            nxt[i]=j;
        }
        for(i=1,j=0;i<=len1;i++){
            while(j && t[j+1]!=s[i]) j=nxt[j];
            if(t[j+1] == s[i]) ++j;
            if(j==len2){
                ans++;j=nxt[j];
                return i-len2+1;
            }
        }
        return -1;
    }
    //数字版本kmp
    vector<int> Ans;
    
    int kmp_digit(int a[],int len1,int b[],int len2){//b是模式串,a是匹配串
        int ans=0;
        int i,j;
        nxt[0]=nxt[1]=0;
        for (i=2,j=0;i<=len2;i++){
            while(j && b[j+1]!=b[i]) j=nxt[j];
            if(b[j+1] == b[i]) ++j;
            nxt[i]=j;
        }
        for (i=1,j=0;i<=len1;i++){
            while(j && b[j+1]!=a[i]) j=nxt[j];
            if(b[j+1] == a[i]) ++j;
            if(j==len2){
                ans++;j=nxt[j];
                // Ans.push_back(i-len2+1);//如果需要存储每一个b在a中出现的位置,可以记录下来
                return i-len2+1;//这里返回的是第一个位置
            }
        }
        return -1;
    }
    
    int a[maxn],b[maxn];
    
    int main(){
        // freopen("1.out","w",stdout);
        int T;
        scanf("%d",&T);
        for(int _=1;_<=T;_++)
        {   
            Ans.clear();
            scanf("%d %d",&n,&m);
            memset(nxt,0,sizeof(nxt));
            for (int i=1;i<=n;i++){
                scanf("%d",&a[i]);
            }
            for (int i=1;i<=m;i++){
                scanf("%d",&b[i]);
            }
            int ans = kmp_digit(a,n,b,m);
            // for (auto i : Ans){
            //     printf("%d
    ",i);
            // }
            printf("%d
    ",ans);
        }
        return 0;
    }
    /*
    1
    6 2
    1 2 1 3 2 1
    2 1
    */
    
    你将不再是道具,而是成为人如其名的人
  • 相关阅读:
    SystemTap
    在qemu上运行BusyBox
    Initramfs 原理和实践
    在qemu环境中用gdb调试Linux内核
    [转载] 你所不知道的TIME_WAIT和CLOSE_WAIT
    Linux VXLAN
    :not伪类选择器一些错误的写法
    c# 微软小冰-虚拟女友聊天
    Django使用表单操作数据库
    Django内置过滤器详解附代码附效果图--附全部内置过滤器帮助文档
  • 原文地址:https://www.cnblogs.com/wsl-lld/p/13526927.html
Copyright © 2011-2022 走看看