zoukankan      html  css  js  c++  java
  • kmp模板题

    给定一个整数数组,最多100w个元素。再给一个特征数组,最多1w个元素。求特征数组在第一个数组中第一次出现的位置。如果没有出现,输出-1.

    有多组数据。

    kmp的模板题。

    kmp有两种写法。第一种是求出nxt数组,nxt[i]表示当i失配时,则跳到nxt[i]的位置。注意设置nxt[0]=-1。

    第二种是求出f数组。f[i]表示字符串S[0..i]的最长前后缀公共子串的长度。此时,注意设置f[0]=0。血的教训:将f[0]设成了-1,结果弄了好久。

    其中nxt和f的关系(下标均从0开始) nxt[i]=f[i-1]。

    比较而言,第一种写法更为简单。

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 1000005
    int num1[MAXN],num2[MAXN],nxt[MAXN],f[MAXN],n,m,t;
    void getnxt()
    {
        nxt[0]=-1;
        for(int i=1;i<m;i++)
        {
            int j;
            for(j=nxt[i-1];j>=0&&num2[i-1]!=num2[j];j=nxt[j]);
            nxt[i]=j+1;
        }
    }
    int kmp()
    {
        for(int i=0,j=0;i<n;i++,j++)
        {
            while(j>=0&&num1[i]!=num2[j])
                j=nxt[j];
            if(j==m-1)
                return i-m+2;
        }
        return -1;
    }
    int main()
    {
      scanf("%d",&t);
      while(t--)
      {
          scanf("%d%d",&n,&m);
          for(int i=0;i<n;i++)
            scanf("%d",&num1[i]);
          for(int i=0;i<m;i++)
            scanf("%d",&num2[i]);
          getnxt();
          printf("%d
    ",kmp());
      }
      return 0;
    }
    
  • 相关阅读:
    BNU Online Judge-29140
    HDU-1022-Train Problem I
    HDU-1312-Red and Black
    BNU Online Judge-34978-汉诺塔
    BNU Online Judge-34976-数细菌
    BNU Online Judge-34973-Liserious战队
    HDU-1010-Tempter of the Bone
    HDU-1518-Square
    thinkphp笔记
    1210. 连号区间数
  • 原文地址:https://www.cnblogs.com/hefenghhhh/p/7850126.html
Copyright © 2011-2022 走看看