[洛谷P3346][ZJOI2015]诸神眷顾的幻想乡
题目大意:给你一棵$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;
- }
[洛谷P3346][ZJOI2015]诸神眷顾的幻想乡的更多相关文章
- 洛谷P3346 [ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
题意 题目链接 Sol 广义SAM的板子题. 首先叶子节点不超过20,那么可以直接对每个叶子节点为根的子树插入到广义SAM中. 因为所有合法的答案一定是某个叶子节点为根的树上的一条链,因此这样可以统计 ...
- Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机
题目链接 \(Click\) \(Here\) 真的是好题啊-不过在说做法之前先强调几个自己总是掉的坑点. 更新节点永远记不住往上跳\(p = fa[p]\) 新建节点永远记不住\(len[y] = ...
- P3346 [ZJOI2015]诸神眷顾的幻想乡
思路 注意到叶子节点(度数为1)只有20个,可以分别以这20个节点为根,把所有子串插入SAM中,统计最后的本质不同的子串个数 所以就是广义SAM了 然后注意要判断一下有无重复插入 代码 #includ ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1017 Solved: 599[Submit][S ...
- bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解
先说一下对后缀自动机的理解,主要是对构造过程的理解. 构造中,我们已经得到了前L个字符的后缀自动机,现在我们要得到L+1个字符的后缀自动机,什么需要改变呢? 首先,子串$[0,L+1)$对应的状态不存 ...
- 【BZOJ 3926】 [Zjoi2015]诸神眷顾的幻想乡 (广义SAM)
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 974 Solved: 573 Descriptio ...
- 字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 843 Solved: 510[Submit][St ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 [广义后缀自动机 Trie]
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1124 Solved: 660[Submit][S ...
- 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
[BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...
随机推荐
- treetable--.net webform中树形table表管理的应用
好记性不如烂笔头. treetable 官网:http://ludo.cubicphuse.nl/jquery-treetable/#api 今天要做一个关于table的树节点展示,还有编辑,删除功能 ...
- Android AOSP 单独编译某一模块
由于AOSP 项目太大,我只修改了一个模块,比如设置. 那么只需要单独编译设置这个模块就可以了. 首先执行Source: source build/envsetup.sh 执行之后,就会有一些额外的命 ...
- “网易有钱”sketch使用分享
本文来自网易云社区 写在开头,关于ps与sketch之间的优劣网上已经有很多分享,大家有兴趣可以百度,其中对否我们在这里不予评价.在移动互联网时代每个app从几十到上百张页面,如果用ps绘制一个个页面 ...
- Python 列表下标操作
Python 列表下标操作 引用网址: https://www.jianshu.com/p/a98e935e4d46
- 初识java atomic
2018-8-19 昨天看到java.util.concurrent.atomic相关的文章,之前有过留意但并未去了解,正好有空学习一下.本人理解atomic包是concurrent子包,当是为并发所 ...
- Java注解的基本原理
注解的本质就是一个继承了Annotation接口的接口,一个注解准确意义上来说,只不过是一种特殊注释而已,如果没有解析他的代码,他可能连注释都不如. 解析一个类或者方法的注解往往有两种形式,一种是编译 ...
- 204. Singleton
Description Singleton is a most widely used design pattern. If a class has and only has one instance ...
- Open MPI集群运行
部署完之后,代码也能正确跑起来了,也确实集群分散了.跑一下各种各样的代码,发现了一个错误: $ ~/OpenMpi/bin/mpiexec -np ~/NetWorkTest My rank is M ...
- SpringCloud IDEA 教学 (二) Eureka Service
写在开头 本篇继续介绍基于Eureka的SpringCloud微服务搭建,回顾一下搭建过程, 第一步:建立一个服务注册中心: 第二步:建立微服务并注入到注册中心: 第三步:建立client端来访问微服 ...
- centos配置iptables
第一次配置前消除默认的规则 #这个一定要先做,不然清空后可能会悲剧 iptables -P INPUT ACCEPT #清空默认所有规则 iptables -F #清空自定义的所有规则 iptable ...