BZOJ3926 (后缀自动机)
BZOJ3926 诸神眷顾的幻想乡
Problem :
给一个n个节点的树(n<=10^5), 每个点有一种颜色(c<=10), 询问所有点对之间路径组成字符串的种类。保证叶子节点小于等于20.
Solution :
分别从每个叶子节点开始遍历整棵树,将遍历到的字符串加入后缀自动机。
只需要修改后缀自动机的last,就可以实现添加多串。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 * 15 * 2;
vector <int> eg[N];
int cl[N];
int deg[N];
int n, c;
struct Suffix_Automanon
{
	int nt[N][15], fail[N], a[N];
	int p, q, np, nq;
	int tot, root;
	int newnode(int len)
	{
		for (int i = 0; i < 15; ++i) nt[tot][i] = -1;
		fail[tot] = -1; a[tot] = len;
		return tot++;
	}
	void clear()
	{
		tot = 0;
		root = newnode(0);
	}
	void insert(int ch, int &last)
	{
		p = last; last = np = newnode(a[p] + 1);
		for (; ~p && nt[p][ch] == -1; p = fail[p]) nt[p][ch] = np;
		if (p == -1) fail[np] = root;
		else
		{
			q = nt[p][ch];
			if (a[q] == a[p] + 1) fail[np] = q;
			else
			{
				nq = newnode(a[p] + 1);
				for (int i = 0; i < 15; ++i) nt[nq][i] = nt[q][i];
				fail[nq] = fail[q]; fail[q] = fail[np] = nq;
				for (; ~q && nt[p][ch] == q; p = fail[p]) nt[p][ch] = nq;
			}
		}
	}
	void solve()
	{
		long long ans = 0;
		for (int i = 1; i < tot; ++i)
			ans += a[i] - a[fail[i]];
		cout << ans << "\n";
	}
}sam;
void dfs(int u, int fa, int now)
{
	sam.insert(cl[u], now);
	for (int i = 0; i < (int)eg[u].size(); ++i)
	{
		int v = eg[u][i];
		if (v != fa) dfs(v, u, now);
	}
}
int main()
{
	cin.sync_with_stdio(0);
	cin >> n >> c;
	for (int i = 1; i <= n; ++i) cin >> cl[i];
	for (int i = 1; i <= n; ++i) eg[i].clear(), deg[i] = 0;
	for (int i = 1; i <  n; ++i)
	{
		int u, v;
		cin >> u >> v;
		eg[u].push_back(v);
		eg[v].push_back(u);
		deg[u]++; deg[v]++;
	}
	sam.clear();
	for (int i = 1; i <= n; ++i)
		if (deg[i] == 1)
			dfs(i, 0, 0);
	sam.solve();
}
												
											BZOJ3926 (后缀自动机)的更多相关文章
- bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解
		
先说一下对后缀自动机的理解,主要是对构造过程的理解. 构造中,我们已经得到了前L个字符的后缀自动机,现在我们要得到L+1个字符的后缀自动机,什么需要改变呢? 首先,子串$[0,L+1)$对应的状态不存 ...
 - 【BZOJ3926】诸神眷顾的幻想乡(后缀自动机)
		
[BZOJ3926]诸神眷顾的幻想乡(后缀自动机) 题面 BZOJ 题解 广义后缀自动机啦 求多个串的不同子串个数? 当然是后缀自动机,最后只要把\(longest-parent.longest\)求 ...
 - [BZOJ3926][ZJOI2015]诸神眷顾的幻想乡(后缀自动机)
		
日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去 ...
 - 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
		
[BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...
 - BZOJ3926&&lg3346 ZJOI诸神眷顾的幻想乡(广义后缀自动机)
		
BZOJ3926&&lg3346 ZJOI诸神眷顾的幻想乡(广义后缀自动机) 题面 自己找去 HINT 我们可以把题目拆解成几个部分,首先我们手玩一个结论,从所有的叶子节点出发,遍历整 ...
 - bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机)
		
bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机) bzoj Luogu 题解时间 给你个无根trie树(你管这叫trie树?),问你选取一条 ...
 - 诸神眷顾的幻想乡(zjoi2015,bzoj3926)(广义后缀自动机)
		
幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. ...
 - BZOJ3926 Zjoi2015 诸神眷顾的幻想乡【广义后缀自动机】
		
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
 - 【BZOJ3926】诸神眷顾的幻想乡 【广义后缀自动机】
		
题意 给定一棵树,每个结点有一个颜色,问树上有多少种子串(定义子串为两点上路径颜色的序列).保证叶子结点<=20 分析 我们可以发现一个结论,任意一个子串一定是以某个叶子结点为根的trie的后缀 ...
 
随机推荐
- os模块详解2
			
1.os.getenv('HOME') 读取操作系统环境变量HOME的值. 2.os.environ 返回操作系统所有的环境变量. 3.os.environ.setdefault(‘a’,‘b’) ...
 - laravel之伪造跨站请求保护CSRF实现机制
			
Laravel 提供了简单的方法使你的应用免受 跨站请求伪造 (CSRF) 的袭击.跨站请求伪造是一种恶意的攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令. Laravel 为每个活跃用户 ...
 - Long time no blogging
			
It is a long time before I posted the last blog on myspace and seems that all of my blogs/documents ...
 - COGS 827. [Tyvj Feb11] 网站计划
			
输入文件:web.in 输出文件:web.out 简单对比时间限制:1 s 内存限制:128 MB 描述 Description Tyvj的Admin--zhq同学将在寒假开始实行 ...
 - 在同一页面显示多个JavaScript统计图表
			
最近我接到一个开发任务,要求就"售后服务客户满意度调查问卷表"里客户填写的反馈答案做一个统计. 问题的例子如下: 您最后一次是何时购买了我们的产品? 服务人员服务态度是否友好.工作 ...
 - ldap_modify: No such object (32) matched DN: cn=config
			
centos 6.9 部署 kerbors ldap 报错 [root@hadoop data]# ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ld ...
 - fork后子进程从哪里开始执行
			
子进程和父进程都从调用fork函数的下一条语句开始执行
 - Java8函数式编程和lambda表达式
			
文章目录函数式编程JDK8接口新特性函数接口方法引用函数式编程函数式编程更多时候是一种编程的思维方式,是一种方法论.函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉 ...
 - liunx+mysql数据库管理
			
源码安装 查询是否安装: rpm -aq |grep mysql 1.下载yum 源 wget 'https://dev.mysql.com/get/mysql57-commu ...
 - uva11491 Erasing and Winning
			
边读入边处理 优化了速度一开始有想错了的地方.处理输入有点想用stringstream, 的问题在于他把字符串连续的数字作为一个整体,遇到空格才分开,所以不适用 #include<cstdio& ...