zoukankan      html  css  js  c++  java
  • KMP(1-模板题)

    Description

    Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.
     

    Input

    The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].
     

    Output

    For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.
     

    Sample Input

    2
    13 5
    1 2 1 2 3 1 2 3 1 3 2 1 2
    1 2 3 1 3
    13 5
    1 2 1 2 3 1 2 3 1 3 2 1 2
    1 2 3 2 1
     

    Sample Output

    6
    -1
    助于理解KMP的链接:http://m.blog.csdn.net/blog/MAOTIANWANG/34466483
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    const int maxn=1000008;
    int t[maxn];
    int s[maxn];
    int n[maxn];
    int len,len1;
    void get_next()
    {
        int i=0;//后移下标
        int j=-1;//起始下标
        n[0]=-1;
        while(i<len)
        {
            if(j==-1||t[i]==t[j])
            {
                i++;//若匹配或为起点后移坐标后移
                j++;//若匹配或为起点起始坐标后移
                n[i]=j;//若匹配则记录前一起始下标情况即匹配数目,不匹配则j=0,记录0
            }
            else
                j=n[j];//如果不匹配则j就倒退回之前达成匹配的最后一位,再次向后匹配,重新来过;
        }//当j=0时,j=n[j]=-1;便于进入if使i++,但j依旧是0,没变,让新的i,新的n[i]存储前一j的情况
    }
    void kmp()
    {
       int i=0;
       int j=0;
       while(i<len1)
       {
           if(s[i]==t[j]||j==-1)
           {
               i++;
               j++;
           }
           else
            j=n[j];
           if(j==len)
           {
               printf("%d
    ",i-len+1);
               return ;
           }
       }
       printf("-1
    ");
    }
    int main()
    {
        int m;
        scanf("%d",&m);
        while(m--)
        {
            memset(n,0,sizeof(n));
            scanf("%d%d",&len1,&len);
            for(int i=0; i<len1; i++)
            {
                scanf("%d",&s[i]);
            }
            for(int j=0; j<len; j++)
            {
                scanf("%d",&t[j]);
            }
            get_next();
            kmp();
        }
        return 0;
    }
  • 相关阅读:
    我见过的最完善的log4net配置
    根据身份证号中的日期判断某人是否已满18岁及是否已满60岁
    第三届“百越杯”福建省高校网络空间安全大赛
    PHP-上传文件
    PHP-操作Mysql
    PHP-异常处理
    PHP-错误处理
    Python(算法)-时间复杂度和空间复杂度
    Python-集合
    Python-字典
  • 原文地址:https://www.cnblogs.com/tianmin123/p/4663854.html
Copyright © 2011-2022 走看看