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) ...
随机推荐
- 3D模型
题目描述 一座城市建立在规则的n×m网格上,并且网格均由1×1正方形构成.在每个网格上都可以有一个建筑,建筑由若干个1×1×1的立方体搭建而成(也就是所有建筑的底部都在同一平面上的).几个典型的城市模 ...
- Codeforces913E. Logical Expression
现有串x=11110000,y=11001100,z=10101010,通过这三个串只用与或非三种操作到达给定的串,优先级非>或>与,可以加括号,问表达式最短的里面字典序最小的是谁,有&l ...
- bat初学
今天在重置某工具软件试用期时(汗,盗版可耻=_=!,鄙视自己一下),实在懒得每次过了试用期再点开注册表,手工删除了,就想着写个脚本执行一下,这里就想起来了bat文件. 首先介绍一下for循环,从百度知 ...
- 创建Django项目(一)
2013-07-24 23:20:58| 最近在学习Django项目的创建,主要的参考资料是:Djangobook 和 Django Project.这些日志用来记录自己的学习过程吧. ...
- vmstat输出项解释
输出项的解释例如以下: procs * r列表示执行和等待cpu时间片段的进程数,这个值假设长期大约系统cpu个数.说明cpu不足 * b列表示在等待资源的进程数.比方正在等待IO或者内存交换等等 m ...
- xode5.1.1设置IOS欢迎界面的方法
先准备3张不同尺寸的欢迎图.文件名称分别为: Default.png iPhone 320X480分辨率屏幕默认启动图片. Default@2x.png iPhone 640X960分辨率屏幕默认启 ...
- 开发,从需求出发 · 之二 造飞机的工厂
CD镇楼~~! 如今.让我们切换到后端开发者的角度看问题.我们须要做的是实现一下这个类,让它返回真实的业务数据. package cn.com.sitefromscrath.service; impo ...
- 鸟哥的Linux私房菜-----9、vi文本处理器
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 用递归将嵌套的JSON对象遍历出来,转为二维数组
如题所示,代码如下: var arJsonNesting = [{id:1,name:"zhang3" ,children:[{id:2,name:"zhang33&qu ...
- 解决ES集群状态异常教程(存在UNASSIGNED)
解决ES集群状态异常教程(存在UNASSIGNED)_百度经验 https://jingyan.baidu.com/article/9158e00013f787a255122843.html