zoukankan      html  css  js  c++  java
  • Number Sequence

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=92486#problem/A
    Number Sequence
    Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
    Submit Status

    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
    题意:在a串中找b串的位置,多个输出最小or输出-1
    最简单kmp……wa哭N次,最后在大牛下终于1a
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 
     5 using namespace std;
     6 
     7 #define maxn 10008
     8 
     9 int n, m, a[maxn*100], b[maxn], Next[maxn];
    10 
    11 void getnext()
    12 {
    13     int j, k;
    14     j = 0;
    15     k = Next[0] = -1;
    16     while(j < m)
    17     {
    18         if(k == -1 || b[j] == b[k])
    19         {
    20             j++;
    21             k++;
    22             Next[j] = k;
    23         }
    24         else
    25             k = Next[k];
    26     }
    27 }
    28 
    29 void slove()
    30 {
    31     int j;
    32     j = 0;
    33     int ans = -1;
    34     for(int i = 0; i < n; )   //  i  不该加就不要加,你用while多好……=。=||
    35     {
    36         while(j == -1 || (a[i] == b[j] && i < n && j < m))
    37             i++, j++;
    38         if(j == m)
    39         {
    40             ans = i - j + 1;
    41             break;
    42         }
    43         j = Next[j];
    44     }
    45     printf("%d
    ", ans);
    46 }
    47 
    48 int main()
    49 {
    50     int t;
    51     scanf("%d", &t);
    52     while(t--)
    53     {
    54         scanf("%d%d", &n, &m);
    55         for(int i = 0; i < n; i++)
    56             scanf("%d", &a[i]);
    57         for(int i = 0; i < m; i++)
    58             scanf("%d", &b[i]);
    59         getnext();
    60         slove();
    61     }
    62     return 0;
    63 }

    刘大大说要用函数……无论多短的代码    

    说的是

  • 相关阅读:
    739. Daily Temperatures
    556. Next Greater Element III
    1078. Occurrences After Bigram
    1053. Previous Permutation With One Swap
    565. Array Nesting
    1052. Grumpy Bookstore Owner
    1051. Height Checker
    数据库入门及SQL基本语法
    ISCSI的概念
    配置一个IP SAN 存储服务器
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4833336.html
Copyright © 2011-2022 走看看