zoukankan      html  css  js  c++  java
  • HDUNumber Sequence(KMP)

    传送门

    题目大意:b在a第一次出现的位置

    题解:KMP

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define N 1000008
    #define M 10009
    using namespace std;
    
    int T;
    
    int a[N],b[M];
    
    int nxt[M];
    
    int lena,lenb;
    
    void getnext()
    {
        memset(nxt,0,sizeof(nxt));
        for(int i=2,j=0;i<=lenb;i++)
        {
            while(b[i]!=b[j+1]&&j) j=nxt[j];
            if(b[i]==b[j+1]) nxt[i]=++j;
        }
    }
    
    int KMP()
    {
        getnext();
    //    for(int i=0;i<=lenb;i++) cout<<i<<"---"<<nxt[i]<<endl;
        for(int i=1,k=0;i<=lena;i++)
        {
            for(;a[i]!=b[k+1]&&k;k=nxt[k]);
            if(a[i]==b[k+1])++k;
            if(k==lenb) return i-lenb+1;
        }
        return -1;
    }
    
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&lena,&lenb);
            for(int i=1;i<=lena;i++) scanf("%d",&a[i]);
            for(int i=1;i<=lenb;i++) scanf("%d",&b[i]);
            printf("%d
    ",KMP()); 
        }
        return 0;
    } 
  • 相关阅读:
    MODBUS 数据格式相关记录
    STM32Cube基础工程配置
    QT5学习记录(一)
    求最大值
    算法训练方格取数
    传纸条
    分组背包
    混合背包
    二维背包
    多重背包
  • 原文地址:https://www.cnblogs.com/zzyh/p/12005385.html
Copyright © 2011-2022 走看看