• HDU——T 1711 Number Sequence


    http://acm.hdu.edu.cn/showproblem.php?pid=1711

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


    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
     
    模板练习题
     1 #include <algorithm>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 const int N(1000000+5);
     7 const int M(10000+626);
     8 int l1,l2,a[N],b[N],p[N];
     9 
    10 inline void Get_next()
    11 {
    12     for(int j=0,i=2;i<=l2;i++)
    13     {
    14         if(j>0&&b[i]!=b[j+1]) j=p[j];
    15         if(b[i]==b[j+1]) j++;
    16         p[i]=j;
    17     }
    18 }
    19 inline void kmp()
    20 {
    21     for(int j=0,i=1;i<=l1;i++)
    22     {
    23         if(j>0&&a[i]!=b[j+1]) j=p[j];
    24         if(a[i]==b[j+1]) j++;
    25         if(j==l2)
    26         {
    27             printf("%d
    ",i-j+1);
    28             return ;
    29         }
    30     }
    31     puts("-1");
    32 }
    33 
    34 int main()
    35 {
    36     int t;scanf("%d",&t);
    37     for(;t--;)
    38     {
    39         scanf("%d%d",&l1,&l2);
    40         for(int i=1;i<=l1;i++) scanf("%d",a+i);
    41         for(int i=1;i<=l2;i++) scanf("%d",b+i);
    42         Get_next();
    43         kmp();
    44     }
    45     return 0;
    46 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    20200816
    20200815
    20200813
    20200811
    20200810
    20200806
    20200804
    20200803
    20200802
    20200801
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7360019.html
Copyright © 2020-2023  润新知