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) ...
随机推荐
- UVA 116_ Unidirectional TSP
题意: 给定整数矩阵,从第一列的任何一个位置出发,每次可以向右.右上.右下走一个格,将最后一行和第一行看成是邻接的,最终到达最后一列,路径长度为所经过格中的整数之和,求最小路径,答案不唯一,输出字典序 ...
- Spring Cloud(6):Zuul的基本使用
网关:API Gateway 系统对外唯一入口,介于客户端和服务端之间,处理非业务功能 提供路由请求,鉴权,监控,缓存,限流等功能 简单理解:小区门卫,防止非法人员入内,居民也可以问路 实际理解:假设 ...
- 联想M7400打印机加粉墨了还是显示没有粉墨
联想M7400打印机加粉墨了还是显示没有粉墨?想必有很多的办公人士发现这个难题吧.其实很简单的! 先说下打印机的原理,打印机粉墨一边用的时候系统也在计数,当我们打印机加好墨后但打印机是不知道已经加好 ...
- 深入理解windows系统内的GMT和时区
http://www.itshanghai.net/technology/wdzl_windowsxp/ UTC(Universal Time Coordinated)是通用协调时,这两者几乎是一 ...
- 总结 React 组件的三种写法 及最佳实践
React 专注于 view 层,组件化则是 React 的基础,也是其核心理念之一,一个完整的应用将由一个个独立的组件拼装而成. 截至目前 React 已经更新到 v15.4.2,由于 ES6 的普 ...
- Windows 7 SID 修改
在安裝Windows系統時會產生一個獨一無二的SID (Security ID),它用來識別每一部主機,若在同一個區域網路內有兩部相同SID的主機,會出現警告訊息.一般而言,每次安裝時的SID不可能會 ...
- Codeforces Round #271 (Div. 2) D. Flowers (递推 预处理)
We saw the little game Marmot made for Mole's lunch. Now it's Marmot's dinner time and, as we all kn ...
- MyEclipse 8.5安装Aptana
Aptana简单介绍 Aptana是一个很强大,开源,专注于JavaScript的Ajax开发IDE它的特性包含: 1.JavaScript,JavaScript函数,HTML,CSS语言的Co ...
- openstack(2) -------RabbitMQ集群部署
一.RabbitMQ简介 RabbitMQ属于一个流行的开源消息队列系统.属于AMQP( 高级消息队列协议 ) 标准的一个 实现.是应用层协议的一个开放标准,为面向消息的中间件设计.用于在分布式系统中 ...
- C Language Study - gets , getchar & scanf
慢慢的发现C语言功底是如此的薄弱,被这几个字符输入函数搞糊涂了又~~ 来,再来忧伤一次吧~ 那么.我们从scanf開始: 假如说你要将一串字符输入到一字符数组里,例如以下面程序, char a[2]; ...