zoukankan      html  css  js  c++  java
  • Number Sequence

    Number Sequence
    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算法,模板题;

    全当做记模板。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int  s[1000010], t[10010];
    int next[10010]; 
    int Kmp(int * s, int n, int * t, int m)
     {
        int i = 0, j = 0;
        while(i < n) 
        {
            if(j == -1 || s[i] == t[j]) 
            {
                ++i; ++j;
                if(j == m)
                 {
                    return i - m + 1;
                 }
            }
            else
             {
                j = next[j];
             }
        }
        return -1;
    }
    void getnext(int *t, int m) {
        int i = 0, j = 0;
        next[0] = -1; j = next[i];
        while(i < m) {
            if(j == -1 || t[i] == t[j]) {
                next[++i] = ++j;
            }
            else {
                j = next[j];
            }
        }
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n,m;
            scanf("%d%d",&n,&m);
    
            for(int i=0;i<n;i++)
            scanf("%d",&s[i]);
    
            for(int i=0;i<m;i++)
            scanf("%d",&t[i]);
    
            getnext(t, m);
    
            printf("%d
    ", Kmp(s, n, t, m));
        }
        return 0;
    }
    

      

  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/-xiangyang/p/9220247.html
Copyright © 2011-2022 走看看