Rabin_Karp(hash) HDOJ 1711 Number Sequence
/*
Rabin_Karp:虽说用KMP更好,但是RK算法好理解。简单说一下RK算法的原理:首先把模式串的哈希值算出来,
在文本串里不断更新模式串的长度的哈希值,若相等,则找到了,否则整个模式串的长度的哈希值向右移动一位
*/
/************************************************
* Author :Running_Time
* Created Time :2015-8-5 14:04:26
* File Name :HDOJ_1711.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef unsigned long long ull;
typedef long long ll;
const int MAXN = 1e6 + ;
const int MAXM = 1e4 + ;
const int INF = 0x3f3f3f3f;
const ull KEY = ;
int a[MAXN], b[MAXM];
int n, m; int match(void) {
ull h = ;
for (int i=; i<m; ++i) h *= KEY;
ull ah = , bh = ;
for (int i=; i<m; ++i) ah = ah * KEY + a[i];
for (int i=; i<m; ++i) bh = bh * KEY + b[i];
for (int i=; i+m<=n; ++i) {
if (ah == bh) return i + ;
if (i + m < n) {
ah = ah * KEY + a[i+m] - a[i] * h;
}
}
return -;
} int main(void) { //HDOJ 1711 Number Sequence
int T; scanf ("%d", &T);
while (T--) {
scanf ("%d%d", &n, &m);
for (int i=; i<n; ++i) scanf ("%d", &a[i]);
for (int i=; i<m; ++i) scanf ("%d", &b[i]);
printf ("%d\n", match ());
} return ;
}
/*
题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4194
给你两个字符串A,B,请输出B字符串在A字符串中出现了几次。
*/
/************************************************
* Author :Running_Time
* Created Time :2015-8-5 14:04:26
* File Name :ZSTU 4194 字符串匹配
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef unsigned long long ull;
typedef long long ll;
const int MAXN = 1e6 + ;
const int INF = 0x3f3f3f3f;
const ull KEY = ;
char t[MAXN], p[MAXN]; int Rabin_Karp(void) {
int lent = strlen (t);
int lenp = strlen (p);
ull h = ;
for (int i=; i<lenp; ++i) h *= KEY;
ull th = , ph = ; int ret = ;
for (int i=; i<lenp; ++i) th = th * KEY + t[i];
for (int i=; i<lenp; ++i) ph = ph * KEY + p[i];
for (int i=; i+lenp<=lent; ++i) {
if (th == ph) {
ret++;
for (int j=i; j<=i+lenp-; ++j) { //找到了一个模式串,不能再用,整个跳过去
th = th * KEY + t[j+lenp] - t[j] * h;
}
i += lenp - ; continue;
}
if (i + lenp < lent) {
th = th * KEY + t[i+lenp] - t[i] * h;
}
}
return ret;
} int main(void) { //ZSTU 4194 字符串匹配
while (scanf ("%s %s", t, p) == ) {
printf ("%d\n", Rabin_Karp ());
} return ;
}
Rabin_Karp应用
/*
这就是赤裸裸的模板题,只不过用数字而已
*/
/************************************************
* Author :Running_Time
* Created Time :2015-8-9 19:45:40
* File Name :KMP.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int MAXN = 1e6 + ;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + ;
int nex[MAXN];
int s[MAXN], t[MAXN]; void get_nex(int lm) {
int i = , j = -; nex[] = -;
while (i < lm) {
if (j == - || t[j] == t[i]) {
i++; j++; nex[i] = j;
}
else j = nex[j];
}
} int KMP(int ln, int lm) {
get_nex (lm);
int i = , j = ;
while (i < ln) {
while (j != - && s[i] != t[j]) j = nex[j];
i++; j++;
if (j == lm) return (i - j + );
}
return -;
} int main(void) { //HDOJ 1711 Number Sequence
int T; scanf ("%d", &T);
while (T--) {
int ln, lm; scanf ("%d%d", &ln, &lm);
for (int i=; i<ln; ++i) scanf ("%d", &s[i]);
for (int i=; i<lm; ++i) scanf ("%d", &t[i]);
printf ("%d\n", KMP (ln, lm));
} return ;
}
KMP
Rabin_Karp(hash) HDOJ 1711 Number Sequence的更多相关文章
- HDOJ 1711 Number Sequence
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdoj 1711 Number Sequence【求字串在母串中第一次出现的位置】
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 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算法)
HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...
- 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) ...
- KMP - HDU 1711 Number Sequence
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 杭电 1711 Number Sequence
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- MySQL Workbench基本操作
MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具.它是著名的数据库设计工具DBDesigner4的继任者.你可以用MySQL Workbench设计和创建新的数据库图示,建 ...
- [NOIP2006] 提高组 洛谷P1066 2^k进制数
题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后 ...
- [bzoj2194]快速傅立叶之二_FFT
快速傅立叶之二 bzoj-2194 题目大意:给定两个长度为$n$的序列$a$和$b$.求$c$序列,其中:$c_i=\sum\limits_{j=i}^{n-1} a_j\times b_{j-i} ...
- 洛谷 P1318 积水面积
P1318 积水面积 题目描述 一组正整数,分别表示由正方体迭起的柱子的高度.若某高度值为x,表示由x个正立方的方块迭起(如下图,0<=x<=5000).找出所有可能积水的地方(图中蓝色部 ...
- 洛谷 P4379 [USACO18OPEN]Lemonade Line
P4379 [USACO18OPEN]Lemonade Line 题目描述 这是农场上一个炎热的夏日,Farmer John要给他的 NN 头奶牛发柠檬汽水了!所有的 NN 头奶牛(方便起见,编号为 ...
- HAProxy+Redis实现负载负载均衡(待实践)
为什么要使用HA,原因是可以聚合出一个VIP,也就是可以使用单一IP来访问下面多个Redis的实例. 首先说明一下,如果基于3.0以后搭建的官方原始Redis Cluster方案,使用HAProxy是 ...
- kill杀死进程方法
查找进程:ps -ef | grep firefox kill -s 9 1827
- JavaScript错误处理和堆栈追踪
转自:https://github.com/dwqs/blog/issues/49 有时我们会忽略错误处理和堆栈追踪的一些细节, 但是这些细节对于写与测试或错误处理相关的库来说是非常有用的. 例如这周 ...
- KLT 光流
一 光流 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在 ...
- Windows网络编程:winsock文件传输范例
基于TCP流协议的winsock网络文件传输Demo: 实现:C语言 功能:文件传输(可以传任何格式的文件) /******************************************** ...