神奇的性质,叶子节点不超过20个。

然后把这些节点提出来构成一颗新树,那么这些树恰好包含了所有的情况。

所以直接广义后缀自动机。

然后统计本质不同的字符串就很简单显然了。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. #define F(i,j,k) for (int i=j;i<=k;++i)
  8. #define D(i,j,k) for (int i=j;i>=k;--i)
  9. #define ll long long
  10. #define maxn 4000005
  11.  
  12. struct Generalized_Suffix_Array{
  13. int cnt;
  14. int go[maxn][10],l[maxn],fa[maxn];
  15. int add(int x,int p)
  16. {
  17. // printf("Add %d on %d\n",x,p);
  18. int q;
  19. if (q=go[p][x])
  20. {
  21. if (l[p]+1==l[q]) return q;
  22. else
  23. {
  24. int nq=++cnt;l[nq]=l[p]+1;
  25. memcpy(go[nq],go[q],sizeof go[q]);
  26. fa[nq]=fa[q];
  27. fa[q]=nq;
  28. for (;p&&go[p][x]==q;p=fa[p]) go[p][x]=nq;
  29. return nq;
  30. }
  31. }
  32. else
  33. {
  34. int np=++cnt; l[np]=l[p]+1;
  35. for (;p&&!go[p][x];p=fa[p]) go[p][x]=np;
  36. if (!p) fa[np]=1;
  37. else
  38. {
  39. q=go[p][x];
  40. if (l[q]==l[p]+1) fa[np]=q;
  41. else
  42. {
  43. int nq=++cnt;
  44. l[nq]=l[p]+1;
  45. memcpy(go[nq],go[q],sizeof go[q]);
  46. fa[nq]=fa[q];
  47. fa[q]=fa[np]=nq;
  48. for (;p&&go[p][x]==q;p=fa[p]) go[p][x]=nq;
  49. }
  50. }
  51. return np;
  52. }
  53. }
  54. void init()
  55. {cnt=1;memset(go,0,sizeof go);}
  56. void solve()
  57. {
  58. ll ans=0;
  59. F(i,1,cnt)
  60. {
  61. // printf("%d --> %d\n",i,fa[i]);
  62. // printf("%d %d\n",l[i],l[fa[i]]);
  63. ans+=l[i]-l[fa[i]];
  64. }
  65. printf("%lld\n",ans);
  66. }
  67. }sam;
  68.  
  69. int h[maxn],to[maxn],ne[maxn],en=0,du[maxn];
  70.  
  71. void addedge(int a,int b)
  72. {to[en]=b;ne[en]=h[a];h[a]=en++;du[a]++;}
  73.  
  74. int n,c,a[maxn];
  75.  
  76. void dfs(int o,int fa,int p)
  77. {
  78. // printf("dfs on %d %d %d\n",o,fa,p);
  79. int np=sam.add(a[o],p);
  80. for (int i=h[o];i>=0;i=ne[i]) if (to[i]!=fa) dfs(to[i],o,np);
  81. }
  82.  
  83. int main()
  84. {
  85. sam.init();
  86. scanf("%d%d",&n,&c);
  87. memset(h,-1,sizeof h);
  88. F(i,1,n) scanf("%d",&a[i]);
  89. F(i,1,n-1)
  90. {
  91. int a,b;
  92. scanf("%d%d",&a,&b);
  93. addedge(a,b);
  94. addedge(b,a);
  95. }
  96. F(i,1,n) if (du[i]==1) dfs(i,-1,1);
  97. sam.solve();
  98. }

  

BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡 ——广义后缀自动机的更多相关文章

  1. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 [广义后缀自动机 Trie]

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1124  Solved: 660[Submit][S ...

  2. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串

    https://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机是一种可以处理好多字符串的一种数据结构(不像后缀自动机只有处理一到两种的时候比 ...

  3. BZOJ.3926.[ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)

    题目链接 要对多个串同时建立SAM,有两种方法: 1.将所有串拼起来,中间用分隔符隔开,插入字符正常插入即可. 2.在这些串的Trie上建SAM.实际上并不需要建Trie,还是只需要正常插入(因为本来 ...

  4. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机 多串)

    因为任何一条路径都可以看做某两个叶子节点之间路径的一部分,然后分别把20个叶节点当作根,把整棵树看作trie树,那么一条路径就能看作是从根到某个点这一条路的后缀,构建SAM就能维护不同子串的个数了. ...

  5. 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

    [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...

  6. BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡(后缀自动机)

    被这道题坑了= =只与一个空地相连的空地不超过20个只与一个空地相连的空地不超过20个 因为很重要所以说两遍 就是说儿子节点最多只有20个 把这20个节点作为根遍历一遍所得到的tire所得到的所有不同 ...

  7. 洛谷P3346 [ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)

    题意 题目链接 Sol 广义SAM的板子题. 首先叶子节点不超过20,那么可以直接对每个叶子节点为根的子树插入到广义SAM中. 因为所有合法的答案一定是某个叶子节点为根的树上的一条链,因此这样可以统计 ...

  8. bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机模板

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...

  9. [ZJOI2015]诸神眷顾的幻想乡 广义后缀自动机_DFS_语文题

    才知道题目中是只有20个叶子节点的意思QAQ.... 这次的广义后缀自动机只是将 last 设为 1, 并重新插入. 相比于正统的写法,比较浪费空间. Code: #include <cstdi ...

随机推荐

  1. Fragment 创建及替换

    1.Fragment的产生与介绍 Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应 ...

  2. iOS Block的本质(四)

    iOS Block的本质(四) 上一篇文章iOS Block的本质(三)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block内修改变量的值 int main(int ar ...

  3. codevs 2277 爱吃皮蛋的小明(水题日常)

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题目描述 Description 小明特别爱吃蛋,特别是皮蛋.他一次可以吃一个蛋或者两个蛋(整个吞下去),而且他 ...

  4. 安卓统一推送联盟融云成唯一IM云服务企业

    10月16日,安卓统一推送联盟在北京正式成立,来自中国信息通信研究院,华为.小米.OPPO等手机厂商,BAT等互联网巨头公司等75家机构及企业代表参加了联盟成立大会,融云也受邀参会并成为首批成员单位中 ...

  5. Javascript的一些经验总结

    JavaScript作用域 1.作用域 JavaScript的作用域与C.Java等语言不同,它不是以花括号包围的块级作用域,这个特性经常被大多数人忽视.例如下面代码,在大多数类C的语言中会出现变量未 ...

  6. 补题—Codeforces Round #346 (Div. 2) _智商欠费系列

    这次的题目相对容易 但是智商依旧不够用 原因有三点 1.英文水平堪忧 2 逻辑不严密 3 细节掌握不够好 传送门 http://codeforces.com/contest/659 A 题目大意 圆环 ...

  7. KTU Programming Camp (Winter Training Day 1)

    A.B.C(By musashiheart) 0216个人赛前三道题解 E(By ggg) Gym - 100735E Restore H(by pipixia) Gym - 100735H

  8. 一条SQL语句在MySQL中是如何执行的

    概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...

  9. 带二级目录的Nginx配置------目前找到的最简单的方法

    由于项目不知一个,所以不得不为每一个项目建一个专有的文件夹,这就导致了在配置nginx的时候会出现二级目录 目前找到的最简单的方法     - step1:修改 vue.config.js   添加配 ...

  10. C语言数据类型_02

    C语言数据类型: