zoukankan      html  css  js  c++  java
  • kmp

    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
    
    1. #include<stdio.h>  
    2. #include<string.h>  
    3. int next[10005];  
    4. int s[1000005],p[10005];  
    5. int n,m;  
    6. void getNext(int p[])  
    7. {  
    8.     int i=0,j=-1,len=m-1;  
    9.     next[0]=-1;  
    10.     while(i<len)  
    11.     {  
    12.         if(j==-1||p[i]==p[j])  
    13.         {  
    14.             i++,j++;  
    15.             next[i]=j;}  
    16.         else j=next[j];  
    17.     }  
    18. }  
    19. int kmp(int n,int m)  
    20. {  
    21.     int i=0,j=0;  
    22.     while(i<n&&j<m)  
    23.     {  
    24.         if(j==-1||s[i]==p[j])  
    25.         i++,j++;  
    26.         else j=next[j];  
    27.     }  
    28.     if(j==m)return i-j+1;  
    29.     else return -1;  
    30. }  
    31. int main()  
    32. {  
    33.     int t,i,j;  
    34.     scanf("%d",&t);  
    35.     while(t--)  
    36.     {  
    37.         scanf("%d%d",&n,&m);  
    38.         for(i=0;i<n;i++)  
    39.         scanf("%d",&s[i]);  
    40.         for(j=0;j<m;j++)  
    41.         scanf("%d",&p[j]);  
    42.         getNext(p);  
    43.         printf("%d ",kmp(n,m));  
    44.     }  
    45.     return 0;  
    46. }  
    #include<stdio.h>
    #include<string.h>
    int next[10005];
    int s[1000005],p[10005];
    int n,m;
    void getNext(int p[])
    {
        int i=0,j=-1,len=m-1;
        next[0]=-1;
        while(i<len)
        {
            if(j==-1||p[i]==p[j])
            {
                i++,j++;
                next[i]=j;}
            else j=next[j];
        }
    }
    int kmp(int n,int m)
    {
        int i=0,j=0;
        while(i<n&&j<m)
        {
            if(j==-1||s[i]==p[j])
            i++,j++;
            else j=next[j];
        }
        if(j==m)return i-j+1;
        else return -1;
    }
    int main()
    {
        int t,i,j;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(i=0;i<n;i++)
            scanf("%d",&s[i]);
            for(j=0;j<m;j++)
            scanf("%d",&p[j]);
            getNext(p);
            printf("%d
    ",kmp(n,m));
        }
        return 0;
    }


     
  • 相关阅读:
    LevelDB安装配置
    Enumerable.Intersect方法来生成2个序列的交集
    .Net 分页功能实现
    Canvas统计图表(多边形,蜘蛛网,渐变色)
    存储格式与压缩算法
    Hive数仓构建及数据倾斜
    团队沟通
    git错误:OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
    linux搭建gitlab服务器
    2018牛客网暑期ACM多校训练营第一场
  • 原文地址:https://www.cnblogs.com/luzhongshan/p/3869563.html
Copyright © 2011-2022 走看看