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 }

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

    说的是

  • 相关阅读:
    js对象的sessionStorage,判断对象相等,判断是否包含某属性
    vant-ui的van-area使用
    JavaScript返回格式化的时间字符串
    vant-ui的van-uploader上传图片
    移动端vue页面禁止移动/滚动
    vue项目中的跨域源请求拦截问题CORS头缺少'Access-Control-Allow-Origin'
    项目开发过程中踩坑和填坑
    周报
    构建一个最简单的react程序
    Socket实现简易“多人聊天室”
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4833336.html
Copyright © 2011-2022 走看看