zoukankan      html  css  js  c++  java
  • hdu1711

    Number Sequence

    Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 8078 Accepted Submission(s): 3670

    Problem 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
     
    #include<stdio.h>
    #include<string.h>
    int next[10005],lena,lenb;
    int a[1000005],b[10005];
    void set_naxt()//子串的next数组
    {
        int i=0,j=-1;
        next[0]=-1;
        while(i<lenb)
        {
            if(j==-1||b[i]==b[j])
            {
                i++; j++;
                next[i]=j;
            }
            else
            j=next[j];
        }
    }
    int kmp()
    {
        int i=0,j=0;//比较时j=0
        set_naxt();
        while(i<lena)
        {
            if(j==-1||a[i]==b[j])
            {
                i++;j++;
            }
            else
            j=next[j];//在这里有可能等于-1,
    
            if(j==lenb)
            return i-j+1;
        }
        return -1;
    }
    int main()
    {
        int i,t;
        scanf("%d",&t);
        while(t--)
        {
            memset(next,0,sizeof(next));
            scanf("%d%d",&lena,&lenb);
            for(i=0;i<lena;i++)
            scanf("%d",&a[i]);
            for(i=0;i<lenb;i++)
            scanf("%d",&b[i]);
            printf("%d
    ",kmp());
        }
    }
    



  • 相关阅读:
    三数之和
    罗马数字与整数
    Oracle 开启或关闭归档
    Oracle RMAN scripts to delete archivelog
    Oracle check TBS usage
    Oracle kill locked sessions
    场景9 深入RAC运行原理
    场景7 Data Guard
    场景4 Data Warehouse Management 数据仓库
    场景5 Performance Management
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3217896.html
Copyright © 2011-2022 走看看