D. Match & Catch

能够用各种方法做。字符串hash。后缀数组,dp。拓展kmp,字典树。。

字符串hash(模板)

http://blog.csdn.net/gdujian0119/article/details/6777239

  1. BKDR Hash Function
  1. // BKDR Hash Function
  2. unsigned int BKDRHash(char *str)
  3. {
  4. unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
  5. unsigned int hash = 0;
  6.  
  7. while (*str)
  8. {
  9. hash = hash * seed + (*str++);
  10. }
  11.  
  12. return (hash & 0x7FFFFFFF);
  13. }

本题hash解法 n^2

  1. #define ULL unsigned long long
  2. const int maxn = 5111 * 2;
  3.  
  4. const int HASH = 10007;
  5. struct HashMap{
  6. int head[HASH];
  7.  
  8. int next[maxn];
  9. ULL state[maxn];
  10. int num_s1[maxn];
  11. int num_s2[maxn];
  12.  
  13. int sz;
  14. void init()
  15. {
  16. sz = 0;
  17. memset(head, -1, sizeof(head));
  18. }
  19. int insert(ULL val, bool info)
  20. {
  21. int h = val % HASH;
  22. for (int i = head[h]; i != -1; i = next[i])
  23. {
  24. if (val == state[i])
  25. {
  26. if (info) num_s1[i]++;
  27. else num_s2[i]++;
  28. return 1;///存在
  29. }
  30. }
  31. num_s1[sz] = 0;
  32. num_s2[sz] = 0;
  33. state[sz] = val;
  34. next[sz] = head[h];
  35.  
  36. if (info) num_s1[sz]++;
  37. else num_s2[sz]++;
  38.  
  39. head[h] = sz++;
  40.  
  41. return 0;///不存在
  42. }
  43. bool check()
  44. {
  45. for (int i = 0; i < sz; i++)
  46. {
  47. if (num_s1[i] == num_s2[i] && num_s1[i] == 1)
  48. return true;
  49. }
  50. return false;
  51. }
  52. }H;
  53.  
  54. const int SEED = 13331;
  55. ULL P[maxn];
  56. ULL s1[maxn], s2[maxn];
  57.  
  58. char sa[maxn], sb[maxn];
  59.  
  60. void hash_pre(ULL P[])
  61. {
  62. P[0] = 1;
  63. for (int i = 1; i <= maxn; i++)
  64. P[i] = P[i - 1] * SEED;
  65. }
  66. void hash_init(ULL s1[], char sa[])///sa[],下标从0開始;相应是s1[]的值得下标从1開始
  67. {
  68. int n = strlen(sa);
  69. s1[0] = 0;
  70. for (int i = 1; i <= n; i++)
  71. s1[i] = s1[i - 1] * SEED + sa[i - 1];
  72. }
  73. ULL getSeg(ULL s1[], int l, int r)///求s1[]的下标区间的hash值
  74. {
  75. return s1[r] - s1[l - 1] * P[r - l + 1];
  76. }
  77.  
  78. int main()
  79. {
  80. hash_pre(P);
  81.  
  82. RS(sa); RS(sb);
  83. int n = strlen(sa), m = strlen(sb);
  84.  
  85. hash_init(s1, sa);
  86. hash_init(s2, sb);
  87.  
  88. int fla = 0;
  89. int mn = min(n, m);
  90. for (int i = 1; i <= mn; i++)
  91. {
  92. H.init();
  93. for (int j = i; j <= n; j++)
  94. {
  95. H.insert(getSeg(s1, j - i + 1, j), 0);
  96. }
  97. for (int j = i; j <= m; j++)
  98. {
  99. H.insert(getSeg(s2, j - i + 1, j), 1);
  100. }
  101.  
  102. if (H.check())
  103. {
  104. printf("%d\n", i);
  105. fla = 1;
  106. break;
  107. }
  108. }
  109. if (!fla) puts("-1");
  110. return 0;
  111. }

后缀数组:

  1. const int MAXN = 5111 * 2;
  2. const int INF = 0x3f3f3f3f;
  3. int wa[MAXN], wb[MAXN], wv[MAXN], wn[MAXN];
  4. //char r[MAXN];
  5. int a[MAXN], sa[MAXN], rank[MAXN], height[MAXN];
  6.  
  7. int cmp(int *r, int a,int b, int k)
  8. {
  9. return r[a] == r[b] && r[a + k] == r[b + k];
  10. }
  11. void build_sa(int *r, int *sa, int n,int m)
  12. {
  13. int i,j, p;
  14. int *x = wa, *y = wb, *t;
  15. for (int i= 0; i < m; i++) wn[i] = 0;
  16. for (int i= 0; i < n; i++) wn[x[i] = r[i]]++;
  17. for (int i = 1; i < m; i++) wn[i] += wn[i - 1];
  18. for (int i = n - 1; i >= 0; i--) sa[--wn[x[i]]] = i;
  19. for (p = 1, j = 1; p < n; j <<= 1, m = p)
  20. {
  21. for (p = 0, i = n - j; i < n; i++) y[p++] = i;
  22. for (i = 0; i < n; i++) if (sa[i] >= j) y[p++] = sa[i] - j;
  23.  
  24. for (i = 0; i < m; i++) wn[i] = 0;
  25. for (i = 0; i < n; i++) wn[wv[i] = x[y[i]]]++;
  26. for (i = 1; i < m; i++) wn[i] += wn[i - 1];
  27. for (i = n - 1; i >= 0; i--) sa[--wn[wv[i]]] = y[i];
  28.  
  29. t = x; x = y; y = t;
  30. x[sa[0]] = 0; p = 1;
  31. for (i = 1; i < n; i++)
  32. x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p++;
  33. }
  34. }
  35. void getHeight(int *r, int *sa, int n)
  36. {
  37. int i, j, k = 0;
  38. for (i = 1; i <= n; i++)
  39. {
  40. rank[sa[i]] = i;
  41. height[i] = 0;
  42. }
  43. for (i = 0;i < n; i++)
  44. {
  45. if (k) k--;
  46. j = sa[rank[i] - 1];
  47. while (r[i + k] == r[j + k]) k++;
  48. height[rank[i]] = k;
  49. }
  50. }
  51.  
  52. char ca[MAXN], cb[MAXN];
  53.  
  54. void solve(int n)
  55. {
  56. height[n + 1] = 0;
  57. int ans = INF;
  58. int l = strlen(ca);
  59. for (int i = 1; i <= n; i++)
  60. {
  61. if (!height[i]) continue;
  62. if (sa[i] < l && sa[i - 1] < l) continue;
  63. if (sa[i] >= l && sa[i - 1] >= l) continue;
  64. int pre = height[i - 1] + 1;
  65. int next = height[i + 1] + 1;
  66. if (height[i] >= max(pre, next))
  67. {
  68. ans = min(ans, max(pre, next));
  69. }
  70. }
  71. if (ans == INF) puts("-1");
  72. else printf("%d\n", ans);
  73. }
  74. int main()
  75. {
  76. int t, n, m;
  77.  
  78. ///n, m
  79. n = 0;
  80. m = 256;
  81.  
  82. RS(ca);
  83. int l = strlen(ca);
  84. REP(j, l) a[n++] = (int)ca[j];
  85. a[n++] = m++;
  86.  
  87. RS(cb);
  88. l = strlen(cb);
  89. REP(j, l) a[n++] = (int)cb[j];
  90. a[n++] = m++;
  91.  
  92. a[--n] = 0; --m;
  93.  
  94. build_sa(a, sa, n + 1, m);
  95. getHeight(a, sa, n);
  96.  
  97. solve(n);
  98.  
  99. return 0;
  100. }
  101. /*
  102. 0 8 0
  103. 1 6 0
  104. 2 4 2
  105. 3 2 4
  106. 4 0 6
  107. 5 7 0
  108. 6 5 1
  109. 7 3 3
  110. 8 1 5
  111. ^^^^^^^^^^^^^^
  112.  
  113. 0 4
  114. 1 8
  115. 2 3
  116. 3 7
  117. 4 2
  118. 5 6
  119. 6 1
  120. 7 5
  121. 8 0
  122. ^^^^^^^^^^^^^^
  123. */

cf244D. Match &amp; Catch 字符串hash (模板)或 后缀数组。。。的更多相关文章

  1. AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)

    如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...

  2. hdu 4622 Reincarnation 字符串hash 模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给定一个长度不超过2000的字符串,之后有不超过1e5次的区间查询,输出每次查询区间中不同 ...

  3. acdream1116 Gao the string!(hash二分 or 后缀数组)

    问题套了一个斐波那契数,归根结底就是要求对于所有后缀s[i...n-1],所有前缀在其中出现的总次数.我一开始做的时候想了好久,后来看了别人的解法才恍然大悟.对于一个后缀来说 s[i...n-1]来说 ...

  4. 字符串HASH模板

    //注意MAXN是最大不同的HASH个数,一般HASHN是MAXN的两倍左右,MAXLEN表示字符串的最大长度 //K表示正确率,越大正确率越高,当时也越费空间,费时间. //使用前注意初始化hash ...

  5. hdu-4080 Stammering Aliens 字符串hash 模板题

    http://acm.hdu.edu.cn/showproblem.php?pid=4080 求出现次数大于等于n的最长串. #include<iostream> #include< ...

  6. 字符串hash 模板

    typedef long long ll; typedef unsigned long long ull; #define maxn 1005 struct My_Hash { ull ; ull p ...

  7. 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串

    Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...

  8. 字符串HASH 学习总结 &amp;&amp; 模板

    一.字符串HASH模板  取自挑战程序设计竞赛(第2版) </pre><pre code_snippet_id="446698" snippet_file_nam ...

  9. poj 3461 字符串单串匹配--KMP或者字符串HASH

    http://poj.org/problem?id=3461 先来一发KMP算法: #include <cstdio> #include <cstring> #include ...

随机推荐

  1. @NotNull、@NotEmpty、@NotBlank的区别

    Spring中@NotNull.@NotEmpty.@NotBlank的区别@NotNull:用于基本数据类型@NotEmpty:用于集合类@NotBlank:用于String上面

  2. React之小知识点总结

    总结react中常常被忽略的小知识点 1)即使state里设置成和之前的值一样,render也会重新渲染 2)父组件传给子组件的属性(props是只读的,在子组件中已在this.state里将属性赋值 ...

  3. 活字格Web应用平台学习笔记1 - 下载安装,ready go

    今年有一个很重要的职业目标,就是好好学习活字格这个神器,争取在这两个月拿到活字格初级工程师的认证证书.给自己加个油,今天开始好好学习,好好做笔记. 第一步,下载安装 先去活字格官网:http://ww ...

  4. Linux CentOS 6.5 + Apache + Mariadb + PHP环境搭建

    Web自动化测试-服务端测试环境部署 by:授客 目录 一. 二. 三. 四. 五. 六. 七. 八. 九. 十. 操作系统环境:CentOS 6.5-x86_64 下载地址:http://www.c ...

  5. Java 装饰器模式详解

    转载请注明出处:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 在上面的几篇文章中,着重介绍了Java 中常见的 IO 相关知 ...

  6. LeetCode题解之Binary Tree Tilt

    1.题目描述 2.分析 利用递归实现. 3.代码 int findTilt(TreeNode* root) { if (root == NULL) ; ; nodesTilt(root,ans); r ...

  7. mysql中删除同一行会经常出现死锁?太可怕了

    之前有一个同事问到我,为什么多个线程同时去做删除同一行数据的操作,老是报死锁,在线上已经出现好多次了,我问了他几个问题:   1. 是不是在一个事务中做了好几件事情?      答:不是,只做一个删除 ...

  8. MySQL 支持utf8mb4

    utf8mb4 utf8mb3 utf8 Refer to The utf8mb4 Character Set The utf8 Character Set (Alias for utf8mb3) M ...

  9. od 转储 二进制文件常用命令

    od :  NAME od - dump files in octal and other formats 常用命令: ➜ Downloads od -t x1 -Ax /etc/ld.so.cach ...

  10. tikv性能参数调优

    tiKV 最底层使用的是 RocksDB(tidb3.0版本中将使用tian存储引擎) 做为持久化存储,所以 TiKV 的很多性能相关的参数都是与 RocksDB 相关的.TiKV 使用了两个 Roc ...