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) ...
随机推荐
- spring-session(一)揭秘
前言 在开始spring-session揭秘之前,先做下热脑(活动活动脑子)运动.主要从以下三个方面进行热脑: 为什么要spring-session 比较traditional-session方案和s ...
- XMLREADER/DOM/SIMPLEXML 解析大文件
DOM和simplexml处理xml非常的灵活方便,它们的内存组织结构与xml文件格式很相近.但是同时它们也有一个缺点,对于大文件处理起来力不从心,太耗内存了. 还好有xmlreader,基于流的解析 ...
- HTML5调用传感器的资料汇总
都可以调用:devicetemperature(温度).devicepressure(压力).devicehumidity(湿度).devicelight(光).devicenoise(声音).dev ...
- POJ 3281_Dining
题意: FJ准备了F种食物和D种饮料,每头牛都有喜欢的食物和饮料,并且每头牛都只能分配一种食物和饮料.问如何分配使得同时得到喜欢的食物和饮料的牛数量最多. 分析: 首先想到将牛与其对应的食物和饮料匹配 ...
- node+mongodb+win7
一.安装mongodb,参照教程,注意要先启动mongod.exe,再启动mongd.exe.
- gulp基本语法
pipe:用管道输送 1.gulp.src(glops[, options]) 输出(Emits)符合所提供的匹配模式(glob)或者匹配模式的数组(array of globs)的文件. 将返回一个 ...
- 洛谷 P1018 乘积最大
P1018 乘积最大 题目描述 今年是国际数学联盟确定的“ 20002000 ――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 9090 周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学 ...
- Sql查询一个列对应多个列
Sql查询一个列对应多个列 今天遇到一个问题,表table1有两个字段col1.col2两个字段.先记录下来,以后有个参考. 现在需要查询出的数据满足如下要求: 1.col1重复.col2重复的数据只 ...
- Java 代理模式和装饰者模式的区别
装饰模式:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案:代理模式:给一个对象提供一个代理对象,并有代理对象来控制对原有对象的引用: 装饰模式应该为所装饰的对象增强功能:代理模式对代理的 ...
- Appium、selenium与Robot Framework
Robot Framework + Appium Appium-Python-Client: 与Appium Library和Appium Server的交互Appium Library通过Appii ...