bzoj3926【ZJOI2015】诸神眷顾的幻想乡
3926: [Zjoi2015]诸神眷顾的幻想乡
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 790 Solved: 485
[Submit][Status][Discuss]
Description
幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日。
Input
第一行两个正整数n,c。表示空地数量和颜色数量。
Output
一行,输出一个整数,表示答案。
Sample Input
0 2 1 2 1 0 0
1 2
3 4
3 5
4 6
5 7
2 5
Sample Output
HINT
对于所有数据,1<=n<=100000, 1<=c<=10。
广义后缀自动机,思路很好
题目有一个关键条件:叶子的数量不超过20个。
以每一个叶子节点为根建一个Trie树,那么整棵树中的任意一条路径,都可以表示成某一个Trie树上一个点到它后代的一条路径。
那么,可以将这些Trie树合并成一个大Trie树,然后求这个大Trie树的字串数量。
这可以用广义的后缀自动机实现。
要注意在加入一个点的时候,如果a[p][x]&&mx[a[p][x]]==mx[p]+1,则不用新建节点,直接返回a[p][x]。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define maxn 100005
#define maxm 2000005
using namespace std;
int n,m,cnt,v[maxn],d[maxn],head[maxn];
ll ans;
struct edge_type{int next,to;}e[maxn*2];
struct sam
{int cnt,fa[maxm],mx[maxm],a[maxm][10];sam(){cnt=1;} void solve(){F(i,1,cnt) ans+=mx[i]-mx[fa[i]];}int add(int p,int x){if (a[p][x]&&mx[a[p][x]]==mx[p]+1) return a[p][x];//广义后缀自动机,注意要判断mx int np=++cnt;mx[np]=mx[p]+1;while (p&&!a[p][x]) a[p][x]=np,p=fa[p];if (!p) fa[np]=1;else{int q=a[p][x];if (mx[p]+1==mx[q]) fa[np]=q;else{int nq=++cnt;mx[nq]=mx[p]+1;memcpy(a[nq],a[q],sizeof(a[q]));fa[nq]=fa[q];fa[np]=fa[q]=nq;while (a[p][x]==q) a[p][x]=nq,p=fa[p];}}return np;}
}sam;
inline int read()
{int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
inline void add_edge(int x,int y)
{e[++cnt]=(edge_type){head[x],y};head[x]=cnt;e[++cnt]=(edge_type){head[y],x};head[y]=cnt;
}
void dfs(int x,int fa,int p)
{int t=sam.add(p,v[x]);for(int i=head[x];i;i=e[i].next) if (e[i].to!=fa) dfs(e[i].to,x,t);
}
int main()
{n=read();m=read();F(i,1,n) v[i]=read();F(i,1,n-1){int x=read(),y=read();add_edge(x,y);d[x]++;d[y]++;}F(i,1,n) if (d[i]==1) dfs(i,0,1);sam.solve();printf("%lld\n",ans);return 0;
}
bzoj3926【ZJOI2015】诸神眷顾的幻想乡相关推荐
- [bzoj3926][Zjoi2015]诸神眷顾的幻想乡
来自FallDream的博客,未经允许, 请勿转载,谢谢. 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情 ...
- 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
[BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...
- [Zjoi2015]诸神眷顾的幻想乡
[Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1537 Solved: 892 Description 幽香 ...
- bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1381 Solved: 811 [ Subm ...
- bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1009 Solved: 596 [ Subm ...
- [ZJOI2015] 诸神眷顾的幻想乡
P3256[ZJOI2015 Day1]诸神眷顾的幻想乡 时间限制 : 20000 MS 空间限制 : 524288 KB 问题描述 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生 ...
- 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- [洛谷P3346][ZJOI2015]诸神眷顾的幻想乡
题目大意:给你一棵$n$个点的树,最多有$20$个叶子节点,问共有几个不同的子串 题解:广义$SAM$,对每个叶子节点深搜一次,每个节点的$lst$设为这个节点当时的父亲,这样就可以时建出来的$SAM ...
- Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机
题目链接 \(Click\) \(Here\) 真的是好题啊-不过在说做法之前先强调几个自己总是掉的坑点. 更新节点永远记不住往上跳\(p = fa[p]\) 新建节点永远记不住\(len[y] = ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡
这道题首先要读明白题,就是说叶子节点不超过20个,那么我们就可以以每一个叶子节点为根建一个广义后缀自动机,这样就一定能表示出来所有的子串,然后统计一下答案就可以啦. (广义后缀自动机就是把好多串放到一 ...
最新文章
- 使用VC++6.0创建MFC对话框程序
- 华为100万部鸿蒙,2019年Q4发布 华为100万部鸿蒙OS手机已开测
- Vue3.0 + Ts 项目框架搭建四:配置 Svg-Icon、Icon图标
- linux常用分区大小,Linux基本知识点总结——硬盘分区及LVM
- html5font标签菜鸟教程,菜鸟教程
- 如何使用计算机自带的刻录软件,Win7系统自带光盘刻录功能如何使用?
- bzoj 4987 Tree
- 庄曜计算机应用作曲电子书阅读,庄曜计算机应用作曲的意义
- 订单流失总金额怎么算_微信新规下增长乏力,裂变到底该怎么做?
- 氨氮吹脱法脱与php有关系吗,吹脱法处理氨氮废水
- JavaScript自定义求和函数
- 单链表的逆置算法解析
- NUL 与 NULL
- 一个简单的C语言代码段,逻辑题
- Redis数据结构之——跳表skiplist
- python复利代码_使用Python进行复利
- linux学习——linux中文件属主、属组是什么意思
- adobe reader java_使用Adobe Reader控件结合Java实现PDF打印功能
- 一键屏蔽135、137、138、139、445危险端口和服务
- URL编码/解码详解
热门文章
- 通过Matlab计算拟合优度
- 【学习笔记】LaTeX中怎么添加文本高亮和给文字标红?
- AD(十八)PCB模块化设计+元件布局+布局优化
- download-git-repo 使用教程
- win10下Chrome弹出广告关闭
- linux安装软件imagemagick,linux下的ImageMagick安装方法
- 信息安全研究领域分类
- JAVA101本土精选,AcWing 101. 最高的牛JAVA
- android 多态按钮,PM撸代码之Android【武侠篇:封装、继承、多态】
- [转载]辜新星:时刻调整方向 找到人生的蓝海