建出AC自动机及其fail树,每次给新加入的串在AC自动机上经过的点染色,问题即转化为子树颜色数。显然可以用dfs序转成序列问题树状数组套权值线段树解决,显然过不掉。事实上直接树上差分,按dfs序排序后lca处-1,树状数组维护子树和即可。

  又一次写了cmp后没放进sort,心态爆炸。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8. #define ll long long
  9. #define N 2000010
  10. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
  11. int gcd(int n,int m){return m==?n:gcd(m,n%m);}
  12. int read()
  13. {
  14. int x=,f=;char c=getchar();
  15. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  16. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  17. return x*f;
  18. }
  19. int n,m,trie[N][],fail[N],val[N],id[N],q[N],tree[N],end[N],tmp[N],cnt;
  20. char s[N];
  21. void add(int k,int x){while (k<=cnt) tree[k]+=x,k+=k&-k;}
  22. int query(int k){int s=;while (k) s+=tree[k],k-=k&-k;return s;}
  23. namespace Tree
  24. {
  25. int p[N],t,dfn[N],size[N],fa[N][],deep[N],cnt;
  26. struct data{int to,nxt;}edge[N];
  27. void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
  28. void dfs(int k)
  29. {
  30. dfn[k]=++cnt;size[k]=;
  31. for (int i=p[k];i;i=edge[i].nxt)
  32. {
  33. deep[edge[i].to]=deep[k]+;
  34. fa[edge[i].to][]=k;
  35. dfs(edge[i].to);
  36. size[k]+=size[edge[i].to];
  37. }
  38. }
  39. void build()
  40. {
  41. cnt=;dfs();
  42. for (int j=;j<;j++)
  43. for (int i=;i<cnt;i++)
  44. fa[i][j]=fa[fa[i][j-]][j-];
  45. }
  46. int lca(int x,int y)
  47. {
  48. if (deep[x]<deep[y]) swap(x,y);
  49. for (int j=;~j;j--) if (deep[fa[x][j]]>=deep[y]) x=fa[x][j];
  50. if (x==y) return x;
  51. for (int j=;~j;j--) if (fa[x][j]!=fa[y][j]) x=fa[x][j],y=fa[y][j];
  52. return fa[x][];
  53. }
  54. }
  55. void ins(char *s,int n,int p)
  56. {
  57. int k=;
  58. for (int i=;i<=n;i++)
  59. {
  60. if (!trie[k][s[i]-'a']) trie[k][s[i]-'a']=++cnt;
  61. k=trie[k][s[i]-'a'];
  62. }
  63. end[p]=k;
  64. }
  65. void build()
  66. {
  67. int head=,tail=;for (int i=;i<;i++) if (trie[][i]) q[++tail]=trie[][i],Tree::addedge(,trie[][i]);
  68. do
  69. {
  70. int x=q[++head];
  71. for (int i=;i<;i++)
  72. if (trie[x][i]) fail[trie[x][i]]=trie[fail[x]][i],Tree::addedge(fail[trie[x][i]],trie[x][i]),q[++tail]=trie[x][i];
  73. else trie[x][i]=trie[fail[x]][i];
  74. }while (head<tail);
  75. Tree::build();
  76. }
  77. bool cmp(const int&a,const int&b)
  78. {
  79. return Tree::dfn[a]<Tree::dfn[b];
  80. }
  81. void run(char *a,int n)
  82. {
  83. int k=,cnt=;tmp[++cnt]=;
  84. for (int i=;i<=n;i++) tmp[++cnt]=k=trie[k][a[i]-'a'];
  85. sort(tmp+,tmp+cnt+,cmp);
  86. for (int i=;i<=cnt;i++) add(Tree::dfn[tmp[i]],);
  87. for (int i=;i<=cnt;i++) add(Tree::dfn[Tree::lca(tmp[i-],tmp[i])],-);
  88. }
  89. int main()
  90. {
  91. #ifndef ONLINE_JUDGE
  92. freopen("bzoj3881.in","r",stdin);
  93. freopen("bzoj3881.out","w",stdout);
  94. const char LL[]="%I64d\n";
  95. #else
  96. const char LL[]="%lld\n";
  97. #endif
  98. m=read();
  99. for (int i=;i<=m;i++)
  100. {
  101. scanf("%s",s+);n=strlen(s+);
  102. ins(s,n,i);
  103. }
  104. build();cnt++;
  105. m=read();
  106. while (m--)
  107. {
  108. int op=read();
  109. if (op==)
  110. {
  111. scanf("%s",s+);n=strlen(s+);
  112. run(s,n);
  113. }
  114. else
  115. {
  116. int x=read();
  117. printf("%d\n",query(Tree::dfn[end[x]]+Tree::size[end[x]]-)-query(Tree::dfn[end[x]]-));
  118. }
  119. }
  120. return ;
  121. }

BZOJ3881 Coci2015Divljak(AC自动机+树上差分+树状数组)的更多相关文章

  1. BZOJ_2434_[NOI2011]_阿狸的打字机_(AC自动机+dfs序+树状数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2434 给出\(n\)个字符串,\(m\)个询问,对于第\(i\)个询问,求第\(x_i\)个字 ...

  2. BZOJ2434[Noi2011]阿狸的打字机——AC自动机+dfs序+树状数组

    题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小 ...

  3. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  4. 【AC自动机】【树状数组】【dfs序】洛谷 P2414 [NOI2011]阿狸的打字机 题解

        这一题是对AC自动机的充分理解和树dfs序的巧妙运用. 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和' ...

  5. NOI 2011 阿狸的打字机 (AC自动机+dfs序+树状数组)

    题目大意:略(太长了不好描述) 良心LOJ传送门 先对所有被打印的字符串建一颗Trie树 观察数据范围,并不能每次打印都从头到尾暴力建树,而是每遍历到一个字符就在Trie上插入这个字符,然后记录每次打 ...

  6. P3250 [HNOI2016] 网络 (树剖+堆/整体二分+树上差分+树状数组)

    解法1: 本题有插入路径和删除路径,在每个节点维护插入堆和删除堆,查询时两者top一样则一直弹出.如果每个节点维护的是经过他的路径,显然有些不好处理,正难则反,每个点维护不经过他的路径,那么x节点出了 ...

  7. BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )

    一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...

  8. BZOJ2434: [NOI2011]阿狸的打字机(AC自动机+dfs序+树状数组)

    [NOI2011]阿狸的打字机 题目链接:https://www.luogu.org/problemnew/show/P2414 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. ...

  9. CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)

    The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...

随机推荐

  1. Ubuntu双系统无法挂载Windows10 硬盘的解决方法

    我的电脑是在Windows 10下安装的Ubuntu 14.04双系统,今天进入Ubuntu系统访问Windows 10 磁盘,出现如下错误: Error mounting /dev/sda1 at ...

  2. js 获取当前页url网址信息

    转载地址:js如何准确获取当前页面url网址信息 摘录: 举例一个URL,然后获得它的各个组成部分:http://i.cnblogs.com/EditPosts.aspx?opt=1 1.window ...

  3. AbelSu教你搭建go语言开发环境

    go语言官网:https://golang.org/ windows:官网下载go1.6.windows-amd64.msi安装文件,安装位置选择默认C:\Go\安装结束后配置环境变量Path: C: ...

  4. test temp

    http://img3.cache.netease.com/love/cssjs/20026/script/page/common.jshttp://img3.cache.netease.com/lo ...

  5. 20155323刘威良《网络对抗》Exp6 信息搜集与漏洞扫描

    20155323刘威良<网络对抗>Exp6 信息搜集与漏洞扫描 实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查 ...

  6. 20155334 曹翔 Exp2 后门原理与实践

    20155334 曹翔 Exp2 后门原理与实践 不多废话直接上实验过程,本实验的所有端口都是5334. 一.实验过程 查询主机Windows和虚拟机kali的ip地址: Windows获得Linux ...

  7. ajax传递数组给controller的实现方法和坑

    这里是前端向后端传递一个数组的方式,参考下面这个示例: (主要是将前端的数组,用 JSON.stringify() 方法json化一下,然后后端springmvc接收到以后,使用 JSONArray  ...

  8. pycharm自动生成头文件注释

    1.在file->settings->file and code templates->python script即可自定制pycharm创建文件自动生成的头文件注释信息 2.创建p ...

  9. Spring+SpringMVC+MyBatis整合基础篇(二)牛刀小试

    前言 承接上文,该篇即为项目整合的介绍了. 废话不多说,先把源码和项目地址放上来,重点要写在前面. 项目展示地址,点这里http://ssm-demo.13blog.site,账号:admin 密码: ...

  10. 虚拟机console最小化安装操作系统图文

    1. 概述2. 安装操作系统2.1 交互界面2.2 内核镜像解压等初始化2.3 磁盘发现2.4 硬件支持告警3. 开始安装3.1 语言选择3.2 键盘选择3.3 服务器类型3.4 配置主机名3.5 时 ...