HDU-1711-Number Sequence(KMP)(Rabin-Karp)
- 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)的更多相关文章
- HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 1711 Number Sequence KMP 基础题
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 1711 Number Sequence (KMP 入门)
Number Sequence Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and ...
- HDU 1711 - Number Sequence - [KMP模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- HDU 1711 Number Sequence KMP
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1711 AC代码: #include <iostream> #include <cs ...
- HDU 1711 Number Sequence (字符串匹配,KMP算法)
HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1711 Number Sequence 【KMP应用 求成功匹配子串的最小下标】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/O ...
- HDU 1711 Number Sequence(KMP)附带KMP的详解
题目代号:HDU 1711 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/ ...
- HDU 1711 Number Sequence (KMP简单题)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- Java连载71-二分查找和Arrays工具类
一.二分法查找 1.二分法查找是建立在已经排序的基础之上的 2.程序分析是从下到大排序. 3.这个数组中没有重复的元素. package com.bjpowernode.java_learning ...
- 干货 | IP高防使用配置
一.知识简介 DoS(Denial of Service),即拒绝服务攻击.该攻击是利用目标系统网络服务功能缺陷或者直接消耗其系统资源,目的是使该目标客户的系统不可用,无法提供正常的服务. DDoS( ...
- PAT Advanced A1104 Sum of Number Segments (20) [数学问题]
题目 Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For e ...
- 如何升级Powershell How to upgrade powershell 5
查看当前版本 Win+R 输入 powershell 进入. 输入:$PSVersionTable 可以看到PS的version: 当前是2.0 下载WMF Windows Management Fr ...
- 第二季第十一天 html5语义化标签 css透明度
span不能设置宽高背景 HTML5语义化标签 <section>标签所包裹的是有一组相似的主题的内容,可以用这个标签来实现文章的章节.标签式对话框中的各种标签页等类似的功能. <s ...
- diverta 2019 Programming Contest 2自闭记
A 签到(a-b problem不用贴了吧,以后atcoder小于300分题均不贴代码) B 发现选择的p,q一定是其中两点间的距离,于是可以O(n2)枚举两点,再O(n2)判断,其实可以做到O(n3 ...
- GCC与G++区别
gcc和g++的区别总结:gcc: GNU C Compilerg++: GNU C++ Compiler 共同点:均属于the GNU Compiler Collection,gcc是鼻祖,后来才有 ...
- Python这五个坑,80%你不知道(对的,五个你知道1个就达到一般水平了)
1 含单个元素的元组 Python中有些函数的参数类型为元组,其内有1个元素,这样创建是错误的: c = (5) # NO! 它实际创建一个整型元素5,必须要在元素后加一个逗号: ! c = (5,) ...
- 关于RL78 系列的bootloader
1.充分了解芯片FLASH结构分布,对FLASH进行分区 2.熟练使用FSL库 3.调试中断映射功能 4.调试一种通信方式,UART,CAN等 5.对FLASH进行编程,执行跳转APP程序,调试一个多 ...
- RxJava的简单使用
0x00 介绍 先简单介绍一下这个库,Rx的一系列实现都是为了解决同一个问题,就是让异步编程变的更加简单.它的主要思想是使用观察者模式,分离了数据源和数据的使用者,同时它拓展了观察者模式,将数据源中的 ...