zoukankan      html  css  js  c++  java
  • hdoj 1711 KMP Number Sequence


    Problem 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
    #include <stdio.h>
    
    int n, m;
    int a[1000005];
    int b[10005];
    int f[10005];
    
    void getfail()
    {
        f[0] = 0;
        f[1] = 0;
        for (int i = 1; i < m; i++)
        {
            int j = f[i];
            while (j && b[i] != b[j])
                j = f[j];
            f[i+1] = b[j] == b[i] ? j + 1 : 0;
        }
    }
    
    int main()
    {
        int flag, i, j, t;
        scanf("%d",&t);
        while (t--)
        {
            scanf("%d %d",&n,&m);
            for (i = 0; i < n; i++)
                scanf("%d",&a[i]);
            for (i = 0; i < m; i++)
                scanf("%d",&b[i]);
            getfail();
            for (i = 0;i <= m; i++) printf("%d ",f[i]);  puts("");
            flag = 1;
            j = 0;
            for (i = 0;i < n;i++)
            {
                while (j && b[j] != a[i])
                    j = f[j];
                if (b[j] == a[i])
                    j++;
                if (j == m)
                {
                    flag = 0;
                    printf("%d\n",i - m + 1);
                }
            }
            if (flag)
                puts("-1");
        }
        return 0;
    }
    
  • 相关阅读:
    9、Spring Boot 2.x 集成 Thymeleaf
    【专题】Spring Boot 2.x 面试题
    8、Spring Boot 2.x 服务器部署
    7、Spring Boot 2.x 集成 Redis
    6、Spring Boot 2.x 集成 MyBatis
    5、Spring Boot 2.x 启动原理解析
    4、Spring Boot 2.x 自动配置原理
    3、Spring Boot 2.x 核心技术
    2、Spring Boot 2.x 快速入门
    centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
  • 原文地址:https://www.cnblogs.com/xindoo/p/3595122.html
Copyright © 2011-2022 走看看