先预处理一个hash[a][b]:开头字符为a, 结尾字符是b,中间的字符hash值为hs的的hash表,保存的是出现次数

对于一个子串求hash值的策略:设hash值是个26位的数,每新增一个字符,就在对应位上+1

  1. #include<bits/stdc++.h>
  2. #include<ext/pb_ds/assoc_container.hpp>
  3. #include<ext/pb_ds/hash_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8. const int MAXN = ;
  9. const int base = ;
  10. const ll mod = 1e9 + ;
  11.  
  12. int add(int a, int b){
  13. return a + b >= mod ? a + b - mod : a + b;
  14. }
  15.  
  16. int sub(int a, int b){
  17. return a - b < ? a - b + mod : a - b;
  18. }
  19.  
  20. int mul(ll a, int b){
  21. return a * b >= mod ? a * b % mod : a * b;
  22. }
  23.  
  24. int qpow(int a, int b){
  25. int ans = ;
  26. for(; b; b >>= ){
  27. if(b & ) ans = mul(ans, a);
  28. a = mul(a, a);
  29. }
  30. return ans;
  31. }
  32.  
  33. gp_hash_table<int, int> mp[][];
  34. int n, m, cnt[MAXN];
  35. char s[MAXN], t[MAXN];
  36.  
  37. struct Node{
  38. int hs;
  39. int len, st, ed;
  40. }nd[MAXN];
  41.  
  42. int main(){
  43. int T, q;
  44. scanf("%d", &T);
  45. while(T --){
  46. for(int i = ; i < ; i ++) for(int j = ; j < ; j ++)
  47. mp[i][j].clear();
  48. scanf("%s", s);
  49. n = strlen(s);
  50. scanf("%d", &q);
  51. for(int i = ; i <= q; i ++){
  52. scanf("%s", t);
  53. m = strlen(t);
  54. cnt[nd[i].len = m] ++;
  55. nd[i].st = t[] - 'a';
  56. nd[i].ed = t[m - ] - 'a';
  57. int tmp = ;
  58. for(int j = ; j < m - ; j ++)
  59. tmp = add(tmp, qpow(base, t[j] - 'a'));
  60. mp[nd[i].st][nd[i].ed][nd[i].hs = tmp] = ;
  61. }
  62. for(int i = ; i <= n; i ++) if(cnt[i]){
  63. int tmp = ;
  64. int st = s[] - 'a';
  65. int ed = s[i - ] - 'a';
  66. for(int j = ; j < i - ; j ++)
  67. tmp = add(tmp, qpow(base, s[j] - 'a'));
  68. if(mp[st][ed].find(tmp) != mp[st][ed].end())
  69. mp[st][ed][tmp] ++;
  70. for(int l = , r = i; r < n; l ++, r ++){
  71. st = s[l] - 'a';
  72. ed = s[r] - 'a';
  73. tmp = sub(tmp, qpow(base, s[l] - 'a'));
  74. tmp = add(tmp, qpow(base, s[r - ] - 'a'));
  75. if(mp[st][ed].find(tmp) != mp[st][ed].end())
  76. mp[st][ed][tmp] ++;
  77. }
  78. }
  79. for(int i = ; i <= q; i ++){
  80. cnt[nd[i].len] --;
  81. printf("%d\n", mp[nd[i].st][nd[i].ed][nd[i].hs] - );
  82. }
  83. }
  84. return ;
  85. }

以字符集为位数的字符串hash——上海网络赛G的更多相关文章

  1. 2019ICPC 上海网络赛 G题 Substring(哈希)

    题意: 给了一个母串S, 每次循环给了一个模板串,问模板串在母 串中“匹配”了多少次?“匹配”的意思就是首字母和尾字母一样, 中间字母顺序可以换. 题解: 字符串hash.我们将询问字符串的首尾特殊h ...

  2. 2019上海网络赛 F. Rhyme scheme 普通dp

    Rhyme scheme Problem Describe A rhyme scheme is the pattern of rhymes at the end of each line of a p ...

  3. [2019上海网络赛F题]Rhyme scheme

    题目链接 题意,求出合法的长度为n的字典序第k小字符串,合法的定义为除了最后一位,每一位的取值范围为'A'到'A'+pos-1,而最后一位的取值范围'A'到当前字符串最大值+1. 队友tql,Orz ...

  4. 2019ICPC 上海网络赛 L. Digit sum(二维树状数组+区间求和)

    https://nanti.jisuanke.com/t/41422 题目大意: 给出n和b,求1到n,各数在b进制下各位数之和的总和. 直接暴力模拟,TLE.. 没想到是要打表...还是太菜了. # ...

  5. hdu 4027 2011上海赛区网络赛G 线段树 成段平方根 ***

    不能直接使用成段增减的那种,因为一段和的平方根不等于平方根的和,直接记录是否为1,是1就不需要更新了 #include<cstdio> #include<iostream> # ...

  6. HDU 5044(2014 ACM-ICPC上海网络赛)

    题意:给定一个树形图,节点10^5,有两种操作,一种是把某两点间路径(路径必定唯一)上所有点的权值增加一个固定值. 另一种也是相同操作,不同的是给边加权值.操作次数10^5.求操作过后,每个点和每条边 ...

  7. hdu 5476 Explore Track of Point(2015上海网络赛)

    题目链接:hdu 5476 今天和队友们搞出3道水题后就一直卡在这儿了,唉,真惨啊……看着被一名一名地挤出晋级名次,确实很不好受,这道恶心的几何题被我们3个搞了3.4个小时,我想到一半时发现样例输出是 ...

  8. 2015上海网络赛 A Puzzled Elena

    题意:给定一棵树,求这个节点的所有子树中包括他本身与它互质的节点的个数. 解题思路:题利用dfs序+容斥原理+前缀和性质解决.题目中要求每个结点,和多少个它的子结点互素.如果每次为了求一个点去跑一遍d ...

  9. 2014上海网络赛 HDU 5053 the Sum of Cube

    水 #include <stdio.h> #include <stdlib.h> #include<math.h> #include<iostream> ...

随机推荐

  1. jdbc——java连接sql server 过程

    首先要去下一个关于sql的驱动jar包,叫做sqljdbc4.jar 然后更新项目的build path,加入这个jar包 前几步有问题的看该博客 https://blog.csdn.net/qq24 ...

  2. SQL注入系列:SQLi Labs

    前言 关于注释 说明:在SQL中--[空格]表示注释,但是在URL中--空格在发送请求的时候会把最后的空格去掉,所以用--+代替,因为+在被URL编码后会变成空格 MYSQL有三种常用注释: --[空 ...

  3. layui-treeTable v2.0添加搜索功能

    layui-treeTable 添加搜索功能 在树形表格头部加一个input框: <div class="layui-inline"> <input class= ...

  4. delphi遍历指定目录下指定类型文件的函数

    遍历指定目录下指定类型文件的函数// ================================================================// 遍历某个文件夹下某种文件,/ ...

  5. VC连接SQLite3的方法(MFC封装类)

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,支持跨平台,操作简单,能够使用很多语言直接创建数据库.官方网站:www.sqlite.org 在VC环境下编写连接SQLite的 ...

  6. AcWing 230. 排列计数 水题(组合数+错排)打卡

    题目:https://www.acwing.com/problem/content/232/ #include<bits/stdc++.h> #define ll long long #d ...

  7. 使用Canvas操作像素

    现代浏览器支持通过<video>元素播放视频.大多数浏览器也可以通过MediaDevices.getUserMedia() API访问摄像头.但即使这两件事结合起来,我们也无法直接访问和操 ...

  8. flutter环境搭建及跑起来demo(多图慎入)

    话不多说,直接上 [1]环境搭建 从git上面clone下来 git clone -b beta https://github.com/flutter/flutter.git 由于国内网络的问题,我就 ...

  9. 极简Vue的异步组件函数

    export default new Router({ routes: [ { path: '/live', name: 'live', component: () => import('@/v ...

  10. win10 打开 sql sever配置管理器

    !找到解决办法啦!WIN10系统 此电脑->右击->管理弹出以上界面啊哈哈哈还有一些解决办法在这个贴吧里...http://tieba.baidu.com/p/3000709047