• 字符串——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
    */
    
    你将不再是道具,而是成为人如其名的人
  • 相关阅读:
    CentOS7下Elastic Stack 5.0日志分析系统搭建
    ElasticSearch 简单入门
    简单使用packetbeat
    centos7没有安装ifconfig命令的解决方法
    CentOS系统下docker的安装与卸载
    centos7 cannot find a valid baseurl for repo base
    HP P2xxx/MSA SMI-S Provider
    Zookeeper 的学习与运用
    kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
    利用开源架构ELK构建分布式日志系统
  • 原文地址:https://www.cnblogs.com/wsl-lld/p/13526927.html
Copyright © 2020-2023  润新知