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) ...
随机推荐
- SpringMVC在使用JSON时报错信息为:Content type 'application/json;charset=UTF-8' not supported
直接原因是:我的(maven)项目parent父工程pom.xml缺少必要的三个jar包依赖坐标. 解决方法是:在web子模块的pom.xml里面添加springMVC使用JSON实现AJAX请求. ...
- Python KNN 学习曲线
学习曲线的目的是选择更好的模型参数.以最近邻算法为例,选取最近的多少个数据点,才能达到最优.可以控制训练集不动,调整最近的点的个数,绘制学习曲线. import matplotlib.pyplot a ...
- 关于JavaWeb中Servlet的总结
Servlet知识结构图 Servlet是JavaWeb服务器端的程序,一般一个Servlet处理一种特定的请求.Servlet编写好后,需要指定其所处理的请求的请求路径,也可以认为Servlet是一 ...
- DataStructuresAndAlgorithm--字谜游戏
参考:http://tieba.baidu.com/p/2071585293 输入是由一些字母构成的一个二维数组以及一些单词组成.目标是要找出字谜中的单词,这些单词可能是水平.垂直或沿对角线上任何方向 ...
- 前端快速构建神器vue-cli,windows下安装并且构建前端项目
1.nodejs官网http://nodejs.cn/下载安装包,傻瓜式安装即可 2.dos命令查询node的版本 node -v 查询版本号 npm -v 查询npm包管理版本 3.安装国内镜像 n ...
- Spring Test+JUnit4整合使用测试ZZJ_淘淘商城项目:day01(RESTful Web Service)
针对整合的Dao层与Service层,在做spring与通用Mapper和分页插件相关测试时比较麻烦.如果只用JUnit测试,需要每次Test方法里初始化一下applicationContext,效率 ...
- linux select函数
/**两个线程一个负责监听客户端,一个负责读客户端请求. 服务器模型,*主控线程负责accept监听链接的客户端,*把客户端fd放入任务队列中(),分离子线程则从任务队列取出所有的*客户端描述加入se ...
- 共享出行疯狂并购背后,打造全交通链条才能让Uber们更快乐
一直以来,携程.滴滴.摩拜等与出行相关的企业总是会因各种负面问题而饱受诟病.但不能否认的是它们极大地提升了出行便利性,让人们的出行更有效率,也更加方便.而与此同时,Uber.Lyft.滴滴等共享打车企 ...
- bzoj5104 Fib数列(BSGS+二次剩余)
快AFO了才第一次写二次剩余的题…… 显然应该将Fn写成通项公式(具体是什么写起来不方便而且大家也都知道),设t=((1+√5)/2)n,T=√5N,然后可以得到t-(-1)t/t=√5N,两边同时乘 ...
- Python程序在docker中运行,未找到自定义模块
错误 Traceback (most recent call last): File "demo.py", line 13, in <module> from test ...