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 }

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

    说的是

  • 相关阅读:
    Jetty 的工作原理以及与 Tomcat 的比较
    基于Tengine的反向代理详细配置
    mysql定时脚本(event),类似oracle的job
    mysql 强制走索引
    如何检查mysql中建立的索引是否生效的检测方法及相关参数说明
    MySQL查询不使用索引汇总
    [大牛翻译系列]Hadoop 翻译文章索引
    [牛感悟系列]JAVA(1)理解JAVA垃圾回收
    [大牛翻译系列]Hadoop系列性能部分完结
    [大牛翻译系列]Hadoop(22)附录D.2 复制连接框架
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4833336.html
Copyright © 2011-2022 走看看