题目大意:给你一棵$n$个点的树,最多有$20$个叶子节点,问共有几个不同的子串

题解:广义$SAM$,对每个叶子节点深搜一次,每个节点的$lst$设为这个节点当时的父亲,这样就可以时建出来的$SAM$含有所有的字串

卡点:

C++ Code:

  1. #include <cstdio>
  2. #include <iostream>
  3.  
  4. #define maxn 100010
  5. int head[maxn], cnt;
  6. struct Edge {
  7. int to, nxt;
  8. } e[maxn << 1];
  9. int ind[maxn];
  10. inline void addedge(int a, int b) {
  11. e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;
  12. e[++cnt] = (Edge) {a, head[b]}; head[b] = cnt;
  13. }
  14.  
  15. int w[maxn];
  16.  
  17. namespace SAM {
  18. #define N (maxn * 22 << 1)
  19. int lst = 1, idx = 1;
  20. int R[N], fail[N], nxt[N][10];
  21. void append(int ch) {
  22. int p = lst, np = lst = ++idx; R[np] = R[p] + 1;
  23. for (; p && !nxt[p][ch]; p = fail[p]) nxt[p][ch] = np;
  24. if (!p) fail[np] = 1;
  25. else {
  26. int q = nxt[p][ch];
  27. if (R[p] + 1 == R[q]) fail[np] = q;
  28. else {
  29. int nq = ++idx;
  30. R[nq] = R[p] + 1, fail[nq] = fail[q], fail[q] = fail[np] = nq;
  31. std::copy(nxt[q], nxt[q] + 10, nxt[nq]);
  32. for (; nxt[p][ch] == q; p = fail[p]) nxt[p][ch] = nq;
  33. }
  34. }
  35. }
  36. void dfs(int u, int fa = 0) {
  37. append(w[u]);
  38. int tmp = lst;
  39. for (int i = head[u]; i; i = e[i].nxt) {
  40. int v = e[i].to;
  41. if (v != fa) dfs(v, u), lst = tmp;
  42. }
  43. }
  44. long long query() {
  45. long long ans = 0;
  46. for (int i = 2; i <= idx; i++) ans += R[i] - R[fail[i]];
  47. return ans;
  48. }
  49. #undef N
  50. }
  51.  
  52. int n, m;
  53. int main() {
  54. scanf("%d%d", &n, &m);
  55. for (int i = 1; i <= n; i++) scanf("%d", w + i);
  56. for (int i = 1, a, b; i < n; i++) {
  57. scanf("%d%d", &a, &b);
  58. addedge(a, b); ind[a]++, ind[b]++;
  59. }
  60. for (int i = 1; i <= n; i++) if (ind[i] == 1) {
  61. SAM::lst = 1;
  62. SAM::dfs(i);
  63. }
  64. printf("%lld\n", SAM::query());
  65. return 0;
  66. }

  

[洛谷P3346][ZJOI2015]诸神眷顾的幻想乡的更多相关文章

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

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

  2. Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机

    题目链接 \(Click\) \(Here\) 真的是好题啊-不过在说做法之前先强调几个自己总是掉的坑点. 更新节点永远记不住往上跳\(p = fa[p]\) 新建节点永远记不住\(len[y] = ...

  3. P3346 [ZJOI2015]诸神眷顾的幻想乡

    思路 注意到叶子节点(度数为1)只有20个,可以分别以这20个节点为根,把所有子串插入SAM中,统计最后的本质不同的子串个数 所以就是广义SAM了 然后注意要判断一下有无重复插入 代码 #includ ...

  4. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡

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

  5. bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解

    先说一下对后缀自动机的理解,主要是对构造过程的理解. 构造中,我们已经得到了前L个字符的后缀自动机,现在我们要得到L+1个字符的后缀自动机,什么需要改变呢? 首先,子串$[0,L+1)$对应的状态不存 ...

  6. 【BZOJ 3926】 [Zjoi2015]诸神眷顾的幻想乡 (广义SAM)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 974  Solved: 573 Descriptio ...

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

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 843  Solved: 510[Submit][St ...

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

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

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

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

随机推荐

  1. treetable--.net webform中树形table表管理的应用

    好记性不如烂笔头. treetable 官网:http://ludo.cubicphuse.nl/jquery-treetable/#api 今天要做一个关于table的树节点展示,还有编辑,删除功能 ...

  2. Android AOSP 单独编译某一模块

    由于AOSP 项目太大,我只修改了一个模块,比如设置. 那么只需要单独编译设置这个模块就可以了. 首先执行Source: source build/envsetup.sh 执行之后,就会有一些额外的命 ...

  3. “网易有钱”sketch使用分享

    本文来自网易云社区 写在开头,关于ps与sketch之间的优劣网上已经有很多分享,大家有兴趣可以百度,其中对否我们在这里不予评价.在移动互联网时代每个app从几十到上百张页面,如果用ps绘制一个个页面 ...

  4. Python 列表下标操作

    Python  列表下标操作 引用网址: https://www.jianshu.com/p/a98e935e4d46

  5. 初识java atomic

    2018-8-19 昨天看到java.util.concurrent.atomic相关的文章,之前有过留意但并未去了解,正好有空学习一下.本人理解atomic包是concurrent子包,当是为并发所 ...

  6. Java注解的基本原理

    注解的本质就是一个继承了Annotation接口的接口,一个注解准确意义上来说,只不过是一种特殊注释而已,如果没有解析他的代码,他可能连注释都不如. 解析一个类或者方法的注解往往有两种形式,一种是编译 ...

  7. 204. Singleton

    Description Singleton is a most widely used design pattern. If a class has and only has one instance ...

  8. Open MPI集群运行

    部署完之后,代码也能正确跑起来了,也确实集群分散了.跑一下各种各样的代码,发现了一个错误: $ ~/OpenMpi/bin/mpiexec -np ~/NetWorkTest My rank is M ...

  9. SpringCloud IDEA 教学 (二) Eureka Service

    写在开头 本篇继续介绍基于Eureka的SpringCloud微服务搭建,回顾一下搭建过程, 第一步:建立一个服务注册中心: 第二步:建立微服务并注入到注册中心: 第三步:建立client端来访问微服 ...

  10. centos配置iptables

    第一次配置前消除默认的规则 #这个一定要先做,不然清空后可能会悲剧 iptables -P INPUT ACCEPT #清空默认所有规则 iptables -F #清空自定义的所有规则 iptable ...