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

    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. 

    InputThe 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]. 
    OutputFor 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
    kmp简单题。
    代码:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int n,m;
    int a[1000001],b[10001];
    void findNext(int *S,int Snum,int *Next) {
        int i = 0,j = -1;
        Next[0] = -1;
        while(i < Snum) {
            if(j == -1 || S[i] == S[j]) {
                Next[++ i] = ++ j;
            }
            else j = Next[j];
        }
    }
    int Kmp() {
        int Next[10001],ans = 0;
        findNext(b,m,Next);
        int i = -1,j = -1;
        while(i < n) {
            if(j == -1 || a[i] == b[j]) {
                i ++,j ++;
            }
            else j = Next[j];
            if(j == m) return i - m + 1;
        }
        return -1;
    }
    int main() {
        int t;
        scanf("%d",&t);
        while(t --) {
            scanf("%d%d",&n,&m);
            for(int i = 0;i < n;i ++) {
                scanf("%d",&a[i]);
            }
            for(int i = 0;i < m;i ++) {
                scanf("%d",&b[i]);
            }
            printf("%d
    ",Kmp());
        }
        return 0;
    }

     又做了一遍复习。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <sstream>
    #include <cstring>
    using namespace std;
    
    int n,m;
    int a[1000001],b[10001];
    void getNext(int *Next) {
        Next[0] = -1;
        int i = -1,j = 0;
        while(j < m) {
            if(i == -1 || b[i] == b[j]) {
                Next[++ j] = ++ i;
            }
            else i = Next[i];
        }
    }
    int Kmp() {
        int Next[10001];
        getNext(Next);
        int i = 0,j = 0;
        while(j < n) {
            if(i == -1 || b[i] == a[j]) {
                i ++;
                j ++;
                if(i == m) return j - m + 1;
            }
            else i = Next[i];
        }
        return -1;
    }
    int main() {
        int t;
        scanf("%d",&t);
        for(int i = 0;i < t;i ++) {
            scanf("%d%d",&n,&m);
            for(int j = 0;j < n;j ++) {
                scanf("%d",&a[j]);
            }
            for(int j = 0;j < m;j ++) {
                scanf("%d",&b[j]);
            }
            printf("%d
    ",Kmp());
        }
    }
  • 相关阅读:
    Unity 用代码设置UGUI的渲染层级
    C/C++常考基础面试题(更新)
    运行Jar包程序Shell
    Shell编程语法
    Spring多个数据源问题:DataSourceAutoConfiguration required a single bean, but * were found
    Maven项目的发布,发布到Nexus
    Consul入门
    application.properties 改成 application.yml
    奖学金申请模板
    jvm
  • 原文地址:https://www.cnblogs.com/8023spz/p/9650962.html
Copyright © 2011-2022 走看看