zoukankan      html  css  js  c++  java
  • hdu 1711 Number Sequence (KMP)

    Number Sequence
    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 40538    Accepted Submission(s): 16729

    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

    C/C++:

     1 #include <map>
     2 #include <queue>
     3 #include <cmath>
     4 #include <vector>
     5 #include <string>
     6 #include <cstdio>
     7 #include <cstring>
     8 #include <climits>
     9 #include <iostream>
    10 #include <algorithm>
    11 #define INF 0x3f3f3f3f
    12 using namespace std;
    13 const int my_max = 1e6 + 10;
    14 
    15 int my_len1, my_len2, my_next[my_max], my_num1[my_max], my_num2[my_max];
    16 
    17 int my_kmp()
    18 {
    19     for (int i = 1, j = 0; i < my_len2; ++ i)
    20     {
    21         while (j > 0 && my_num2[i] != my_num2[j]) j = my_next[j];
    22         if (my_num2[i] == my_num2[j]) ++ j;
    23         my_next[i + 1] = j;
    24     }
    25     for (int i = 0, j = 0; i < my_len1; ++ i)
    26     {
    27         while (j > 0 && my_num1[i] != my_num2[j]) j = my_next[j];
    28         if (my_num1[i] == my_num2[j]) ++ j;
    29         if (j == my_len2) return i + 2 - my_len2;
    30     }
    31     return -1;
    32 }
    33 
    34 int main()
    35 {
    36     int t;
    37     scanf("%d", &t);
    38     while (t --)
    39     {
    40         memset(my_num1, 0, sizeof(my_num1));
    41         memset(my_num2, 0, sizeof(my_num2));
    42         memset(my_next, 0, sizeof(my_next));
    43         scanf("%d%d", &my_len1, &my_len2);
    44         for (int i = 0; i < my_len1; ++ i)
    45             scanf("%d", &my_num1[i]);
    46         for (int i = 0; i < my_len2; ++ i)
    47             scanf("%d", &my_num2[i]);
    48 
    49         printf("%d
    ", my_kmp());
    50     }
    51     return 0;
    52 }
  • 相关阅读:
    浅出Java Socket 编程
    WPF指南之一(WPF的结构)
    使用URL访问网络资源
    WPF指南之三(XAML的名字空间)
    多线程并发思考文件加锁
    关于kindeditor上传图片出现"服务器发生故障"的解决办法
    isset function of PHP
    JSON字符串传到后台PHP处理的问题
    isset function of PHP
    (转)Linux利器 strace
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/9511371.html
Copyright © 2011-2022 走看看