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;
    }
  • 相关阅读:
    遇见phpDesigner我笑了 PHP开发利器
    如何在ThinkPHP中开启调试模式
    thinkphp执行流程
    CAS实现单点登录--错误记录
    HttpServletRequest常用获取URL的方法
    OpenCV图片矩阵操作相关,对png图片操作(多通道)
    万能数据库查询分析器使用技巧之(十六)
    ActiveMQ系列之五:ActiveMQ的Transport
    ActiveMQ系列之四:用ActiveMQ构建应用
    ActiveMQ系列之三:理解和掌握JMS
  • 原文地址:https://www.cnblogs.com/tianmin123/p/4663854.html
Copyright © 2011-2022 走看看