• 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 }

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

    说的是

  • 相关阅读:
    Python3基础 函数 未指定返回值,返回NONE
    Python3基础 函数 有参数有返回值 对传入的参数加1
    Python3基础 函数 无参数无返回值 调用会输出hello world的函数
    Python3基础 函数 收集参数(tuple)+普通参数 的示例
    MVC中几种常用ActionResult
    sqlserver 中存储过程的基础知识记录
    常用的正则表达式方法2
    常用的正则表达式方法1
    vs2012运行项目报未能加载文件或程序集“System.Web.Mvc, Version=4.0.0.1,Culture=neutral”问题和解决方法
    怎样解决PowerDesigner15出现许可证过期问题?
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4833336.html
Copyright © 2020-2023  润新知