题目传送门

 /*
  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. 【ZJOI2017 Round1练习】D8T1 mushroom(点分治)

    题意: 思路: num[a[u]]表示存在a[u]这个颜色且终点在u子树中的链长总和 ans[i]表示以当前的u为根,前面的子树对i的贡献之和 ..]of longint; size,f,ans,su ...

  2. P1614 爱与愁的心痛

    洛谷——P1614 爱与愁的心痛 题目背景 (本道题目隐藏了两首歌名,找找看哪~~~) <爱与愁的故事第一弹·heartache>第一章 <我为歌狂>当中伍思凯神曲<舞月 ...

  3. cn_windows_10_multiple_editions_version_1607_updated_jul_2016_x64

    ed2k://|file|cn_windows_10_multiple_editions_version_1607_updated_jul_2016_x64_dvd_9056935.iso|43471 ...

  4. rsyslog trouble shooting

    openstack,swift的log不输出了.trouble shooting过程 , 发现我们的程序 /var/log/swift/proxy.log等总是不输出log. 因为log rsyslo ...

  5. Kernel与用户进程通信

    测试IPv6 ready logo   rfc 3315的时候,遇到一个问题,要求在收到ICMPv6 RA的时候,DHCPv6  Client要发Solicit消息.在平常的应用中,都是启动DHCPv ...

  6. 【CV论文阅读】Detecting events and key actors in multi-person videos

    论文主要介绍一种多人协作的视频事件识别的方法,使用attention模型+RNN网络,最近粗浅地学习了RNN网络,它比较适合用于处理序列的存在上下文作用的数据. NCAA Basketball数据集 ...

  7. Java VS .NET:Java与.NET的特点对比 单点登录(SSO)的设计

    一.前言 为什么要写Java跟.NET对比? .NET出生之后就带着Java的影子.从模仿到创新,.NET平台也越来越成熟.他们不同的支持者也经常因为孰弱孰强的问题争论不休.但是本文并不是为了一分高下 ...

  8. UVA - 11374 Airport Express (Dijkstra模板+枚举)

    Description Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express ...

  9. 开发,从需求出发 &#183; 之二 造飞机的工厂

    CD镇楼~~! 如今.让我们切换到后端开发者的角度看问题.我们须要做的是实现一下这个类,让它返回真实的业务数据. package cn.com.sitefromscrath.service; impo ...

  10. 通过spark rdd 求取 特征的稀疏向量

    通过spark rdd 求取  特征的稀疏向量 spark 类标签的稀疏 特征向量 - bonelee - 博客园 http://www.cnblogs.com/bonelee/p/7814081.h ...