题目传送门

  1. /*
  2.   Rabin_Karp:虽说用KMP更好,但是RK算法好理解。简单说一下RK算法的原理:首先把模式串的哈希值算出来,
  3. 在文本串里不断更新模式串的长度的哈希值,若相等,则找到了,否则整个模式串的长度的哈希值向右移动一位
  4. */
  5. /************************************************
  6. * Author :Running_Time
  7. * Created Time :2015-8-5 14:04:26
  8. * File Name :HDOJ_1711.cpp
  9. ************************************************/
  10. #include <cstdio>
  11. #include <algorithm>
  12. #include <iostream>
  13. #include <sstream>
  14. #include <cstring>
  15. #include <cmath>
  16. #include <string>
  17. #include <vector>
  18. #include <queue>
  19. #include <deque>
  20. #include <stack>
  21. #include <list>
  22. #include <map>
  23. #include <set>
  24. #include <bitset>
  25. #include <cstdlib>
  26. #include <ctime>
  27. using namespace std;
  28. #define lson l, mid, rt << 1
  29. #define rson mid + 1, r, rt << 1 | 1
  30. typedef unsigned long long ull;
  31. typedef long long ll;
  32. const int MAXN = 1e6 + ;
  33. const int MAXM = 1e4 + ;
  34. const int INF = 0x3f3f3f3f;
  35. const ull KEY = ;
  36. int a[MAXN], b[MAXM];
  37. int n, m;
  38. int match(void) {
  39. ull h = ;
  40. for (int i=; i<m; ++i) h *= KEY;
  41. ull ah = , bh = ;
  42. for (int i=; i<m; ++i) ah = ah * KEY + a[i];
  43. for (int i=; i<m; ++i) bh = bh * KEY + b[i];
  44. for (int i=; i+m<=n; ++i) {
  45. if (ah == bh) return i + ;
  46. if (i + m < n) {
  47. ah = ah * KEY + a[i+m] - a[i] * h;
  48. }
  49. }
  50. return -;
  51. }
  52. int main(void) { //HDOJ 1711 Number Sequence
  53. int T; scanf ("%d", &T);
  54. while (T--) {
  55. scanf ("%d%d", &n, &m);
  56. for (int i=; i<n; ++i) scanf ("%d", &a[i]);
  57. for (int i=; i<m; ++i) scanf ("%d", &b[i]);
  58. printf ("%d\n", match ());
  59. }
  60. return ;
  61. }

  1. /*
  2. 题目链接:http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4194
  3. 给你两个字符串A,B,请输出B字符串在A字符串中出现了几次。
  4. */
  5. /************************************************
  6. * Author :Running_Time
  7. * Created Time :2015-8-5 14:04:26
  8. * File Name :ZSTU 4194 字符串匹配
  9. ************************************************/
  10. #include <cstdio>
  11. #include <algorithm>
  12. #include <iostream>
  13. #include <sstream>
  14. #include <cstring>
  15. #include <cmath>
  16. #include <string>
  17. #include <vector>
  18. #include <queue>
  19. #include <deque>
  20. #include <stack>
  21. #include <list>
  22. #include <map>
  23. #include <set>
  24. #include <bitset>
  25. #include <cstdlib>
  26. #include <ctime>
  27. using namespace std;
  28. #define lson l, mid, rt << 1
  29. #define rson mid + 1, r, rt << 1 | 1
  30. typedef unsigned long long ull;
  31. typedef long long ll;
  32. const int MAXN = 1e6 + ;
  33. const int INF = 0x3f3f3f3f;
  34. const ull KEY = ;
  35. char t[MAXN], p[MAXN];
  36. int Rabin_Karp(void) {
  37. int lent = strlen (t);
  38. int lenp = strlen (p);
  39. ull h = ;
  40. for (int i=; i<lenp; ++i) h *= KEY;
  41. ull th = , ph = ; int ret = ;
  42. for (int i=; i<lenp; ++i) th = th * KEY + t[i];
  43. for (int i=; i<lenp; ++i) ph = ph * KEY + p[i];
  44. for (int i=; i+lenp<=lent; ++i) {
  45. if (th == ph) {
  46. ret++;
  47. for (int j=i; j<=i+lenp-; ++j) { //找到了一个模式串,不能再用,整个跳过去
  48. th = th * KEY + t[j+lenp] - t[j] * h;
  49. }
  50. i += lenp - ; continue;
  51. }
  52. if (i + lenp < lent) {
  53. th = th * KEY + t[i+lenp] - t[i] * h;
  54. }
  55. }
  56. return ret;
  57. }
  58. int main(void) { //ZSTU 4194 字符串匹配
  59. while (scanf ("%s %s", t, p) == ) {
  60. printf ("%d\n", Rabin_Karp ());
  61. }
  62. return ;
  63. }

Rabin_Karp应用

  1. /*
  2. 这就是赤裸裸的模板题,只不过用数字而已
  3. */
  4. /************************************************
  5. * Author :Running_Time
  6. * Created Time :2015-8-9 19:45:40
  7. * File Name :KMP.cpp
  8. ************************************************/
  9. #include <cstdio>
  10. #include <algorithm>
  11. #include <iostream>
  12. #include <sstream>
  13. #include <cstring>
  14. #include <cmath>
  15. #include <string>
  16. #include <vector>
  17. #include <queue>
  18. #include <deque>
  19. #include <stack>
  20. #include <list>
  21. #include <map>
  22. #include <set>
  23. #include <bitset>
  24. #include <cstdlib>
  25. #include <ctime>
  26. using namespace std;
  27. #define lson l, mid, rt << 1
  28. #define rson mid + 1, r, rt << 1 | 1
  29. typedef long long ll;
  30. const int MAXN = 1e6 + ;
  31. const int INF = 0x3f3f3f3f;
  32. const int MOD = 1e9 + ;
  33. int nex[MAXN];
  34. int s[MAXN], t[MAXN];
  35. void get_nex(int lm) {
  36. int i = , j = -; nex[] = -;
  37. while (i < lm) {
  38. if (j == - || t[j] == t[i]) {
  39. i++; j++; nex[i] = j;
  40. }
  41. else j = nex[j];
  42. }
  43. }
  44. int KMP(int ln, int lm) {
  45. get_nex (lm);
  46. int i = , j = ;
  47. while (i < ln) {
  48. while (j != - && s[i] != t[j]) j = nex[j];
  49. i++; j++;
  50. if (j == lm) return (i - j + );
  51. }
  52. return -;
  53. }
  54. int main(void) { //HDOJ 1711 Number Sequence
  55. int T; scanf ("%d", &T);
  56. while (T--) {
  57. int ln, lm; scanf ("%d%d", &ln, &lm);
  58. for (int i=; i<ln; ++i) scanf ("%d", &s[i]);
  59. for (int i=; i<lm; ++i) scanf ("%d", &t[i]);
  60. printf ("%d\n", KMP (ln, lm));
  61. }
  62. return ;
  63. }

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. 3D模型

    题目描述 一座城市建立在规则的n×m网格上,并且网格均由1×1正方形构成.在每个网格上都可以有一个建筑,建筑由若干个1×1×1的立方体搭建而成(也就是所有建筑的底部都在同一平面上的).几个典型的城市模 ...

  2. Codeforces913E. Logical Expression

    现有串x=11110000,y=11001100,z=10101010,通过这三个串只用与或非三种操作到达给定的串,优先级非>或>与,可以加括号,问表达式最短的里面字典序最小的是谁,有&l ...

  3. bat初学

    今天在重置某工具软件试用期时(汗,盗版可耻=_=!,鄙视自己一下),实在懒得每次过了试用期再点开注册表,手工删除了,就想着写个脚本执行一下,这里就想起来了bat文件. 首先介绍一下for循环,从百度知 ...

  4. 创建Django项目(一)

    2013-07-24 23:20:58|   最近在学习Django项目的创建,主要的参考资料是:Djangobook 和 Django Project.这些日志用来记录自己的学习过程吧.       ...

  5. vmstat输出项解释

    输出项的解释例如以下: procs * r列表示执行和等待cpu时间片段的进程数,这个值假设长期大约系统cpu个数.说明cpu不足 * b列表示在等待资源的进程数.比方正在等待IO或者内存交换等等 m ...

  6. xode5.1.1设置IOS欢迎界面的方法

    先准备3张不同尺寸的欢迎图.文件名称分别为: Default.png  iPhone 320X480分辨率屏幕默认启动图片. Default@2x.png iPhone 640X960分辨率屏幕默认启 ...

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

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

  8. 鸟哥的Linux私房菜-----9、vi文本处理器

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. 用递归将嵌套的JSON对象遍历出来,转为二维数组

    如题所示,代码如下: var arJsonNesting = [{id:1,name:"zhang3" ,children:[{id:2,name:"zhang33&qu ...

  10. 解决ES集群状态异常教程(存在UNASSIGNED)

    解决ES集群状态异常教程(存在UNASSIGNED)_百度经验 https://jingyan.baidu.com/article/9158e00013f787a255122843.html