[ZJOI2015]诸神眷顾的幻想乡
嘟嘟嘟
这题除了暴力我就不会了,感觉得用SAM,但是又和普通的SAM不一样。
看了题解才知道,这东西叫广义后缀自动机。
就是解决例如多个串的本质不同的子串的个数这样的问题。
做法就是每插入完一个串,就重新从根节点开始插入另一个字符串。(但一直只有一个SAM)
对于这道题,可以理解为在trie上建SAM。做法就是在trie上dfs,孩子节点从父亲节点在SAM中的位置插入,代码就是这样:
In void dfs(int now, int _f, int p)
{
p = S.insert(col[now], p);
for(int i = head[now], v; ~i; i = e[i].nxt)
if((v = e[i].to) ^ _f) dfs(v, now, p);
}
因为最多只有20个叶节点,所以我们以每一个叶节点为根,跑一边trie,同时往SAM里插入。这样一定包含了任意一条路径。因为一条路径可以看做从某一个根节点出发的路径的子路径。
最后在后缀自动机上求一下本质不同的子串数目就好了。
```c++
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 1e5 + 5;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans = 10) write(x / 10);
putchar(x % 10 + '0');
}
int n, m, col[maxn], du[maxn];
struct Edge
{
int nxt, to;
}e[maxn << 1];
int head[maxn], ecnt = -1;
In void addEdge(int x, int y)
{
e[++ecnt] = (Edge){head[x], y};
head[x] = ecnt;
}
struct Sam
{
int cnt;
int tra[maxn * 40][11], len[maxn * 40], link[maxn * 40];
In void init() {link[cnt = 0] = -1;}
In int insert(int x, int las)
{
int now = ++cnt, p = las;
len[now] = len[las] + 1;
while(~p && !tra[p][x]) tra[p][x] = now, p = link[p];
if(p == -1) link[now] = 0;
else
{
int q = tra[p][x];
if(len[q] == len[p] + 1) link[now] = q;
else
{
int clo = ++cnt;
memcpy(tra[clo], tra[q], sizeof(tra[q]));
len[clo] = len[p] + 1;
link[clo] = link[q], link[q] = link[now] = clo;
while(~p && tra[p][x] == q) tra[p][x] = clo, p = link[p];
}
}
return now;
}
In ll calc()
{
ll ret = 0;
for(int i = 1; i <= cnt; ++i) ret += len[i] - len[link[i]];
return ret;
}
}S;
In void dfs(int now, int _f, int p)
{
p = S.insert(col[now], p);
for(int i = head[now], v; ~i; i = e[i].nxt)
if((v = e[i].to) ^ _f) dfs(v, now, p);
}
int main()
{
Mem(head, -1);
n = read(), m = read();
for(int i = 1; i <= n; ++i) col[i] = read();
for(int i = 1; i < n; ++i)
{
int x = read(), y = read();
addEdge(x, y), addEdge(y, x);
++du[x], ++du[y];
}
S.init();
for(int i = 1; i <= n; ++i) if(du[i] == 1) dfs(i, 0, 0);
write(S.calc()), enter;
return 0;
}
[ZJOI2015]诸神眷顾的幻想乡的更多相关文章
- 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岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...
- bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机)
bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机) bzoj Luogu 题解时间 给你个无根trie树(你管这叫trie树?),问你选取一条 ...
- BZOJ3926:[ZJOI2015]诸神眷顾的幻想乡(广义SAM)
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- BZOJ3926 Zjoi2015 诸神眷顾的幻想乡【广义后缀自动机】
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
随机推荐
- 数据结构——基于java的链表实现(真正理解链表这种数据结构)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10759599.html,否则将追究法律责任!!! 一.链表介绍 1.什么是链表? 链表是一 ...
- Flask 系列之 SQLAlchemy
SQLAlchemy 是一种 ORM 框架,通过使用它,可以大大简化我们对数据库的操作,不用再写各种复杂的 sql语句 了. 说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环 ...
- 2018-08-24 中文代码之Spring Boot对H2数据库简单查询
续前文: 中文代码之Spring Boot集成H2内存数据库 在词条中添加英文术语域: @Entity public class 词条 { @Id private long id; private S ...
- arcgis在折点处打断并建立网络分析(最短路径等问题)
目的:GIS网络分析用于对段路径等问题.这里仅仅讲述如何建立网络分析. 网络建立前必须满足以下条件 1.要素文件在节点处打断(本文下面会叙述) 2.要素文件在地理数据库里的数据集里(一般是这样) 3. ...
- eclipse安装其他颜色主题包
eclipse安装其他颜色主题包: 用Help-Install new software安装的时候,work with的URL是 http://eclipse-color-theme.github.c ...
- 轻松搭建Xposed Hook
0x2.导入xposed库文件XposedBridgeApi-XX.jar,将库文件放在app/lib目录下,自己创建一个lib目录,别放在libs目录下,否则会出错,然后导入库,修改 Scope 为 ...
- Android内存优化(二)解析Memory Monitor、Allocation Tracker和Heap Dump
前言 要想做好内存优化工作,就要掌握两大部分的知识,一部分是知道并理解内存优化相关的原理,另一部分就是善于运用内存分析的工具.本篇就来介绍内存分析工具:Memory Monitor.Allocatio ...
- 布局优化之ViewStub源码分析
源码分析 @RemoteView public final class ViewStub extends View { private int mInflatedId; private int mLa ...
- 关于在ROS kinetic下arbotix报错的问题
最近在学习ros过程中 出现了一个包错误 ERROR:cannot launch node of type [arbotix_python/arbotix_driver]:arbotix_pytho ...
- Orchard详解--第一篇 介绍
Orchard是一个开源的内容管理系统(CMS),它提供了简单的向导式的安装方法,用于快速建站(如WordPress).对于.Net的开发者来说,Orchard有更好的学习价值,所以本系列文章将对Or ...