• Rabin-Karp

    Accepted 1711 904MS 5272K 1310 B G++
    #include "bits/stdc++.h"
    using namespace std;
    typedef long long LL;
    const int MAXN = 1e6 + ;
    const int SEED = 1e9 + ;
    int arr[MAXN];
    int main() {
    int t, n, m, k;
    scanf("%d", &t);
    while (t--) {
    LL p = , s = , head = ;
    bool flag = false;
    scanf("%d%d", &n, &m);
    for (int i = ; i <= n; i++) {
    scanf("%d", &arr[i]);
    }
    // 获取模式串(M数组)的哈希值
    for (int i = ; i <= m; i++) {
    scanf("%d", &k);
    head *= SEED;
    p = p * SEED + k;
    }
    // 获取arr[0]所表示的长度为m的串的哈希值
    for (int i = ; i < m; i++) {
    /*
    比较标准的写法是s = (s * SEED + arr[i]) % MOD;(MOD是一个和SEED互质的数)
    这里利用LL的溢出来省略MOD,可以将MOD看成2的64次方
    */
    s = s * SEED + arr[i];
    }
    for (int i = ; i <= n - m + ; i++) {
    // 用arr[i - 1]所表示的长度为m的串的哈希值得到arr[i]所表示的长度为m的串的哈希值
    s = s * SEED - head * arr[i - ] + arr[i + m - ];
    if (s == p) {
    flag = true;
    printf("%d\n", i);
    break;
    }
    }
    if (!flag) {
    puts("-1");
    }
    }
    return ;
    }

    Rabin-Karp获取哈希值的形式有点像进制转换,由于计算机内二进制加减是不管符号的所以p和s变成负数也无所谓,用unsigned long long和long long是一样的。但是Rabin-Karp不保证匹配结果绝对正确,因为不同的串哈希值可能一样(long long的范围只有2的64次方,但是本题数组值的范围是[-1000000, 1000000],只要三四位产生的串的数量long long就不够放了)所以如果竞赛中用此法错了,可以尝试改SEED。还不行那就只能换方法了。

  • KMP
    Accepted 1711 842MS 5360K 802 B G++
    #include "bits/stdc++.h"
    using namespace std;
    const int MAXN = 1e6 + ;
    const int MAXM = 1e4 + ;
    int s[MAXN], p[MAXM], Next[MAXM] = {-};
    int t, n, m;
    int kmp() {
    int i = , j = -;
    // 求模式串的Next
    while (i < m) {
    if (j == - || p[i] == p[j]) {
    Next[++i] = ++j;
    } else {
    j = Next[j];
    }
    }
    i = , j = ;
    while (i < n) {
    if (j == - || s[i] == p[j]) {
    i++;
    if (++j == m) {
    // 由于题目题目描述的数组下标从1开始,所以追加1
    return i - m + ;
    }
    } else {
    j = Next[j];
    }
    }
    return -;
    }
    int main() {
    scanf("%d", &t);
    while (t--) {
    scanf("%d%d", &n, &m);
    for (int i = ; i < n; i++) {
    scanf("%d", &s[i]);
    }
    for (int i = ; i < m; i++) {
    scanf("%d", &p[i]);
    }
    printf("%d\n", kmp());
    }
    return ;
    }

    复杂度为O(M + N)

HDU-1711-Number Sequence(KMP)(Rabin-Karp)的更多相关文章

  1. HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. hdu 1711 Number Sequence KMP 基础题

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. HDU 1711 Number Sequence (KMP 入门)

    Number Sequence Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and ...

  4. HDU 1711 - Number Sequence - [KMP模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  5. HDU 1711 Number Sequence KMP

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1711 AC代码: #include <iostream> #include <cs ...

  6. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...

  7. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  8. HDU 1711 Number Sequence 【KMP应用 求成功匹配子串的最小下标】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/O ...

  9. HDU 1711 Number Sequence(KMP)附带KMP的详解

    题目代号:HDU 1711 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/ ...

  10. HDU 1711 Number Sequence (KMP简单题)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. Cracking Digital VLSI Verification Interview 第四章

    目录 Hardware Description Languages Verilog SystemVerilog 对Cracking Digital VLSI Verification Intervie ...

  2. 使用itop4412开发板单独编译驱动模块

    上面我们的驱动是放在了内核源码的目录下来实现的编译成驱动模块,很多时候我们都是拿到一个驱动源码,不需要把他放到内核源码里面,而是直接把他编译成驱动模块,下面我们来讲下实现方法,我们还是以蜂鸣器的驱动为 ...

  3. 01 语言基础+高级:1-3 常用API第一部分_day08【String类、static、Arrays类、Math类】

    day08[String类.static.Arrays类.Math类] String类static关键字Arrays类Math类 教学目标能够使用String类的构造方法创建字符串对象能够明确Stri ...

  4. python语法基础-并发编程-进程-进程池以及回调函数

    ###############   进程池    ############## """ 进程池的概念 为什么会有进程池? 1,因为每次开启一个进程,都需要创建一个内存空间 ...

  5. Matlab:fsolve No solution found.

    代码: clear M = 600;N = 420;p=200;q=2282; eq = @(x) x^M-(1+q/p)*x^(M-N)+q/p; options = optimset('MaxFu ...

  6. rabbitmq安装(linux)遇到 很多坑

    1.下载erlang官网地址 http://www.erlang.org/download 挑选合适的版本 然后 建议20.3运行命令 wget http://erlang.org/download/ ...

  7. Angular ng-container ng-template 用法

    ng-container本身不创建任何html代码,相当于一个容器. <ng-container *ngFor="let item of dataSource;let i=index& ...

  8. 14 微服务电商【黑马乐优商城】:day04-项目搭建(一)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...

  9. python与mysql部分函数和控制流语法对比

    条件语句 python语法 a=int(input("输入一个数[0,100]成绩:")) if 100>=a>=90: print("优") el ...

  10. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_全局变量的妙用_遍历穿透

    1 比如我这边写了一个函数,这个函数中有一个变量作为参数,给定这个参数一个值,然后这个函数返回给我一个值.但是,我写这函数的时候,这个传参我不写到函数里面.可以通过全局变量的方式进行在外部穿透遍历. ...