题目传送门

 /*
  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的更多相关文章

  1. HDOJ 1711 Number Sequence

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. hdoj 1711 Number Sequence【求字串在母串中第一次出现的位置】

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  4. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...

  5. HDU 1711 Number Sequence 【KMP应用 求成功匹配子串的最小下标】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/O ...

  6. HDU 1711 Number Sequence(KMP)附带KMP的详解

    题目代号:HDU 1711 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/ ...

  7. HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. KMP - HDU 1711 Number Sequence

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. 杭电 1711 Number Sequence

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. bzoj3545 Peaks 线段树合并

    离线乱搞... 也就是一个线段树合并没什么 #include<algorithm> #include<iostream> #include<cstring> #in ...

  2. htmlspecialschars与htmlentities的区别

    根据php手册,htmlentities与htmlspecialchars功能几乎是一模一样.唯一的差别就是,对于无效的代码单元序列(通俗讲就是不认识的编码)是否进行编码.htmlentities会进 ...

  3. 【IntelliJ】IDEA使用--字体、编码和基本设置

    IDEA这么高端的工具之前只是断断续续使用了一下,因为项目的开发都是在eclipse上,每次学习IDEA的使用都得上网搜索半天,今天自己整理一下,方便以后查阅. IDEA版本15.0.4 字体 界面字 ...

  4. 使用GSON解析JSON文件

    package com.pingyijinren.test; /** * Created by Administrator on 2016/5/19 0019. */ public class App ...

  5. codeforces 691F(组合数计算)

    Couple Cover, a wildly popular luck-based game, is about to begin! Two players must work together to ...

  6. SaltStack学习系列之自定义grains

    Master端 打开存放自定义grains的目录 vim /etc/salt/master file_roots: base: - /srv/salt/ 建立自定义模块 cd /srv/salt mk ...

  7. Django学习系列之路由系统

    一.基于App的路由 作用: 根据App对路由规则进行分类,在全局urls.py包含某个项目的urls.py 示例 定义全局urls.py(全局路由系统) #导入include from django ...

  8. 【转】golang中的并行与并发

    原文:http://blog.csdn.net/taohaoge/article/details/27970421 ------------------------------------------ ...

  9. LinQ开篇介绍

    语言集成查询(LINQ)是 Visual Studio2008中引入的一组功能. 可为 C# 和 Visual Basic 语言语法提供强大的查询功能. LINQ引入了标准易学的数据查询和更新模式,能 ...

  10. HDU-3295-An interesting mobile game(BFS+DFS)

    Problem Description XQ,one of the three Sailormoon girls,is usually playing mobile games on the clas ...