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

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

卡点:

C++ Code:

#include <cstdio>
#include <iostream>#define maxn 100010
int head[maxn], cnt;
struct Edge {int to, nxt;
} e[maxn << 1];
int ind[maxn];
inline void addedge(int a, int b) {e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;e[++cnt] = (Edge) {a, head[b]}; head[b] = cnt;
}int w[maxn];namespace SAM {
#define N (maxn * 22 << 1)int lst = 1, idx = 1;int R[N], fail[N], nxt[N][10];void append(int ch) {int p = lst, np = lst = ++idx; R[np] = R[p] + 1;for (; p && !nxt[p][ch]; p = fail[p]) nxt[p][ch] = np;if (!p) fail[np] = 1;else {int q = nxt[p][ch];if (R[p] + 1 == R[q]) fail[np] = q;else {int nq = ++idx;R[nq] = R[p] + 1, fail[nq] = fail[q], fail[q] = fail[np] = nq;std::copy(nxt[q], nxt[q] + 10, nxt[nq]);for (; nxt[p][ch] == q; p = fail[p]) nxt[p][ch] = nq;}}}void dfs(int u, int fa = 0) {append(w[u]);int tmp = lst;for (int i = head[u]; i; i = e[i].nxt) {int v = e[i].to;if (v != fa) dfs(v, u), lst = tmp;}}long long query() {long long ans = 0;for (int i = 2; i <= idx; i++) ans += R[i] - R[fail[i]];return ans;}
#undef N
}int n, m;
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) scanf("%d", w + i);for (int i = 1, a, b; i < n; i++) {scanf("%d%d", &a, &b);addedge(a, b); ind[a]++, ind[b]++;}for (int i = 1; i <= n; i++) if (ind[i] == 1) {SAM::lst = 1;SAM::dfs(i);}printf("%lld\n", SAM::query());return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10162064.html

[洛谷P3346][ZJOI2015]诸神眷顾的幻想乡相关推荐

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

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

  2. [Zjoi2015]诸神眷顾的幻想乡

    [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1537  Solved: 892 Description 幽香 ...

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

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

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

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 1381   Solved: 811 [ Subm ...

  5. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 1009   Solved: 596 [ Subm ...

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

    P3256[ZJOI2015 Day1]诸神眷顾的幻想乡 时间限制 : 20000 MS   空间限制 : 524288 KB 问题描述 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生 ...

  7. [bzoj3926][Zjoi2015]诸神眷顾的幻想乡

    来自FallDream的博客,未经允许, 请勿转载,谢谢. 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情 ...

  8. 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

    Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...

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

    这道题首先要读明白题,就是说叶子节点不超过20个,那么我们就可以以每一个叶子节点为根建一个广义后缀自动机,这样就一定能表示出来所有的子串,然后统计一下答案就可以啦. (广义后缀自动机就是把好多串放到一 ...

最新文章

  1. linux中的vsprintf_Git29 年超 100 万次 commit,Linux 内核何以发展至今?
  2. 股票软件开发中全推与点播的区别(自己留作记录的,请csdn的小编别乱删我的文章)...
  3. MS SQL SERVER2005更新触发器
  4. Sklearn环境搭建与常用包
  5. sql中update多表处理
  6. 国电集团:电子招投标每年节约成本10亿元
  7. Juce-强大的开源类库
  8. Docker入门到实践 (一) docker简介与安装、常用命令讲解
  9. 人脸识别最低像素_深入浅出人脸识别技术
  10. 日本房产泡沫的崩塌,虽然很长,希望80后仔细阅读
  11. WSTMart商城系统数据字典
  12. 尚融宝——阿里云短信验证功能(sms)
  13. IT运维和自动化运维以及运维开发有啥不同?能解释下吗?
  14. Oracle to_date()函数的用法
  15. (2) Hive安装
  16. 10种常见的移动端App广告展现形式
  17. Android AccountManager帐号管理(一)
  18. SpringBoot整合SpringEmail 批量发送邮件
  19. 软件测试——基础练习(期末复习)
  20. 数据恢复软件设计与实现(二)

热门文章

  1. ElasticSearch 6.4.3 启动报错: [Cannot assign requested address: bind]
  2. 输入一组数,找出满足某条件的数
  3. 关于数论【莫比乌斯反演】
  4. 【Alpha】十天屠龙记
  5. Java 8 Lambda表达式10个示例【存】
  6. 使用iframe设置frameset的高度
  7. PHP中stripslashes函数的小结
  8. 在线图片水平/垂直均等切割工具
  9. Vue和React组件之间的传值方式
  10. PureMVC--一款多平台MVC框架