GRE Words Revenge

题意和思路都和上一篇差不多。

有一个区别就是需要移动字符串。关于这个字符串,可以用3次reverse来转换, 前面部分翻转一下, 后面部分翻转一下, 最后整个串翻转一下就好了。

注意就是多组测试,需要初始化。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
  4. #define LL long long
  5. #define ULL unsigned LL
  6. #define fi first
  7. #define se second
  8. #define pb push_back
  9. #define lson l,m,rt<<1
  10. #define rson m+1,r,rt<<1|1
  11. #define max3(a,b,c) max(a,max(b,c))
  12. #define min3(a,b,c) min(a,min(b,c))
  13. typedef pair<int,int> pll;
  14. const int INF = 0x3f3f3f3f;
  15. const LL mod = (int)1e9+;
  16. const int N = 1e7;
  17. struct Node{
  18. static const int m = ;
  19. static const int KN = N;
  20. int next[KN][m], fair[KN], tot = , mark[KN], mark1[KN], root[], cnt = , si[];
  21. void init(){
  22. tot = cnt = ;
  23. }
  24. int newtree(){
  25. tot++;
  26. fair[tot] = mark[tot] = mark1[tot] = ;
  27. memset(next[tot], , sizeof(next[tot]));
  28. return tot;
  29. }
  30. void Build(int x){
  31. queue<int> q;
  32. q.push(x);
  33. int pos, p, v;
  34. while(!q.empty()){
  35. pos = q.front(), q.pop();
  36. for(int i = ; i < m; i++){
  37. if(!next[pos][i]) continue;
  38. p = fair[pos]; v = next[pos][i];
  39. while(p && !next[p][i]) p = fair[p];
  40. if(p) fair[v] = next[p][i];
  41. else fair[v] = x;
  42. q.push(v);
  43. mark1[v] = mark1[fair[v]] + mark[v];
  44. }
  45. }
  46. }
  47. void Add(char s[], char ch){
  48. root[++cnt] = newtree(); si[cnt] = ;
  49. int pos = root[cnt];
  50. for(int i = ; s[i]; i++){
  51. if(!next[pos][s[i]-ch]) next[pos][s[i]-ch] = newtree();
  52. pos = next[pos][s[i]-ch];
  53. }
  54. mark[pos]++;
  55. while(si[cnt] == si[cnt-]){
  56. Unit(root[cnt-], root[cnt]);
  57. si[--cnt] *= ;
  58. }
  59. Build(root[cnt]);
  60. }
  61. int Query(char s[], char ch){
  62. int pos, ret = ;
  63. for(int id = ; id <= cnt; id++){
  64. pos = root[id];
  65. for(int i = ; s[i]; i++){
  66. while(pos && !next[pos][s[i]-ch]) pos = fair[pos];
  67. if(pos) pos = next[pos][s[i]-ch];
  68. else pos = root[id];
  69. ret += mark1[pos];
  70. }
  71. }
  72. return ret;
  73. }
  74. void Unit(int u, int v){
  75. mark[u] += mark[v];
  76. for(int i = ; i < m; i++){
  77. if(!next[u][i] || !next[v][i]) next[u][i] += next[v][i];
  78. else Unit(next[u][i], next[v][i]);
  79. }
  80. }
  81. }ac;
  82. char str[N];
  83. set<ULL> st;
  84. ULL v = ;
  85. int main(){
  86. int n, m, L = , len, k;
  87. scanf("%d", &n);
  88. for(int cas = ; cas <= n; cas++){
  89. L = ;
  90. ac.init();
  91. st.clear();
  92. scanf("%d", &m);
  93. printf("Case #%d:\n", cas);
  94. while(m--){
  95. scanf("%s", str);
  96. len = strlen(str+);
  97. k = L % len;
  98. reverse(str+, str++k);
  99. reverse(str++k, str++len);
  100. reverse(str+, str++len);
  101. if(str[] == '+'){
  102. v = ;
  103. for(int i = ; str[i]; i++){
  104. v = v * + (str[i]-'');
  105. }
  106. if(st.count(v)) continue;
  107. else {
  108. st.insert(v);
  109. ac.Add(str+,'');
  110. }
  111. }
  112. else {
  113. L = ac.Query(str+, '');
  114. printf("%d\n", L);
  115. }
  116. }
  117. }
  118. return ;
  119. }

GRE Words Revenge AC自动机 二进制分组的更多相关文章

  1. 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组

    F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...

  2. [HDU 4787] GRE Words Revenge (AC自动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4787 题目大意: 给你若干个单词,查询一篇文章里出现的单词数.. 就是被我水过去的...暴力重建AC自 ...

  3. CF710F-String Set Queries【AC自动机,二进制分组】

    正题 题目链接:https://www.luogu.com.cn/problem/CF710F 题目大意 \(T\)次操作 往集合中加入一个字符串 往集合中删除一个字符串 给出一个模式串求出现的集合里 ...

  4. HDU 3341 Lost's revenge AC自动机+dp

    Lost's revenge Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)T ...

  5. hdu 4117 GRE Words (ac自动机 线段树 dp)

    参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后 ...

  6. HDU3341 Lost's revenge(AC自动机&&dp)

    一看到ACGT就会想起AC自动机上的dp,这种奇怪的联想可能是源于某道叫DNA什么的题的. 题意,给你很多个长度不大于10的小串,小串最多有50个,然后有一个长度<40的串,然后让你将这个这个长 ...

  7. hdu_3341_Lost's revenge(AC自动机+状态hashDP)

    题目链接:hdu_3341_Lost's revenge 题意: 有n个模式串,一个标准串,现在让标准串重组,使得包含最多的模式串,可重叠,问重组后最多包含多少模式串 题解: 显然是AC自动机上的状态 ...

  8. hdu3341Lost's revenge (AC自动机+变进制dp)

    Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submissio ...

  9. hdu3341Lost's revenge(ac自动机+dp)

    链接 类似的dp省赛时就做过了,不过这题卡内存,需要把当前状态hash一下,可以按进制来算出当前的状态,因为所有的状态数是不会超过10*10*10*10的,所以完全可以把这些存下来. 刚开始把trie ...

随机推荐

  1. Vue项目的创建和UI资源

    Vue项目创建打包与UI资源 1.Vue项目创建 1.1 vue-cli脚手架 vue-cli是一个基于vue的构建工具,用于搭建vue项目的环境,有着兼容,方便,快速的优点,能够完全遵循前后端分离的 ...

  2. Transformations 方块转换 USACO 模拟 数组 数学 耐心

    1006: 1.2.2 Transformations 方块转换 时间限制: 1 Sec  内存限制: 128 MB提交: 10  解决: 7[提交] [状态] [讨论版] [命题人:外部导入] 题目 ...

  3. 5.Go-封装、继承、接口、多态和断言

    面向对象 Go语言开发者认为:面向对象就是特定类型(结构体)有着自己的方法,利用这个方法完成面向对象编程, 并没有提封装.继承.多态.所以Go语言进行面向对象编程时,重点在于灵活使用方法. Go语言有 ...

  4. JavaFX 选择文件 导入Excel文件并解析

    FXML 控制器 : @FXML public void selectExcel(MouseEvent event) { FileChooser fileChooser = new FileChoos ...

  5. JVM和GC的工作原理

    转载于https://uestc-dpz.github.io JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM ...

  6. javaScript基础-02 javascript表达式和运算符

    一.原始表达式 原始表达式是表达式的最小单位,不再包含其他表达式,包含常量,直接量,关键字和变量. 二.对象和数组的初始化表达式 对象和数组初始化表达式实际上是一个新创建的对象和数组. 三.函数表达式 ...

  7. 实时计算大数据处理的基石-Google Dataflow

    ​ 此文选自Google大神Tyler Akidau的另一篇文章:Streaming 102: The world beyond batch ​ 欢迎回来!如果您错过了我以前的帖子,Streaming ...

  8. 【JVM从小白学成大佬】开篇

    JVM的重要性毋庸置疑,可以毫不夸张的说Java虚拟机是整个Java平台的基石. JVM方面的知识,也一直是BAT等大厂面试考核的重点.特别是JVM调优,故障排查性能调优,你知道该从哪些方面入手吗? ...

  9. 使用BeanShell断言判断请求返回的Json相应结果(不同json格式整理)

    第一种json格式 { "code": 0, "msg": "success", "success": true, &q ...

  10. Okhttp3源码解析(3)-Call分析(整体流程)

    ### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析]( ...