【bzoj3926】【Zjoi2015】诸神眷顾的幻想乡



题解:
- 如果树上某个路径串的端点不是叶子,那么一定是另一个串的子串;
- 这样只对叶子$dfs$把$20*20$个串插入广义$SAM$就是统计本质不同的串的个数的模板了;
- 我不太会分析广义$SAM$的空间,但是我知道似乎完全图是有$n-1$条欧拉回路的,所以长度不会超过$2n*(20-1)$,需要卡一卡;
- 可能后面会补广义的坑吧。。。。
#include<bits/stdc++.h>
#define rg register
#define il inline
#define ll long long
using namespace std;
const int N=,M=;
int n,m,sz,mx[N*M],pa[N*M],s[N],len,col[N],ch[N*M][],d[N],cnt,a[N],w[N],st[N*M],o,hd[N];
ll val[N*M];
struct Edge{int v,nt;}E[N<<];
il char gc(){
static char*p1,*p2,S[];
if(p1==p2)p2=(p1=S)+fread(S,,,stdin);
return(p1==p2)?EOF:*p1++;
}
il int rd(){
int x=;char c=gc();
while(c<''||c>'')c=gc();
while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
return x;
}
il void adde(int u,int v){
E[o]=(Edge){v,hd[u]};hd[u]=o++;d[u]++;
E[o]=(Edge){u,hd[v]};hd[v]=o++;d[v]++;
}
il void ins(){
/*
for(int i=1;i<=len;i++)printf("%d ",s[i]);
puts("");
*/
int lst=,np,nq,p,q,x;
for(rg int i=;i<=len;i++){
x=s[i];
p=lst; mx[lst=np=++sz]=mx[p]+;
while(p&&!ch[p][x])ch[p][x]=np,p=pa[p];
if(!p){pa[np]=;continue;}
q=ch[p][x];
if(mx[q]==mx[p]+)pa[np]=q;
else {
mx[nq=++sz]=mx[p]+;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
pa[nq]=pa[q];pa[q]=pa[np]=nq;
while(p&&ch[p][x]==q)ch[p][x]=nq,p=pa[p];
}
}
}
il void dfs(int u,int fa){
for(rg int i=hd[u];i;i=E[i].nt){
int v=E[i].v;
if(v==fa)continue;
s[++len]=col[v];
dfs(v,u);
}
if(d[u]==&&fa)ins();
len--;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj3926.in","r",stdin);
freopen("bzoj3926.out","w",stdout);
#endif
n=rd();m=rd();
for(rg int i=;i<=n;i++)col[i]=rd();
for(rg int i=o=;i<n;i++)adde(rd(),rd());
sz=;
for(rg int i=;i<=n;i++)if(d[i]==)a[++cnt]=i;
for(int i=;i<=cnt;i++){
s[len=]=col[a[i]];
dfs(a[i],);
}
for(rg int i=;i<=sz;i++)w[mx[i]]++;
for(rg int i=;i<=n;i++)w[i]+=w[i-];
for(rg int i=sz;i;i--)st[w[mx[i]]--]=i;
for(rg int i=sz,u;i;i--){
val[u=st[i]]=;
for(rg int j=;j<m;j++){
val[u]+=val[ch[u][j]];
}
}
--val[];
printf("%lld\n",val[]);
return ;
}bzoj3926
【bzoj3926】【Zjoi2015】诸神眷顾的幻想乡的更多相关文章
- bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解
先说一下对后缀自动机的理解,主要是对构造过程的理解. 构造中,我们已经得到了前L个字符的后缀自动机,现在我们要得到L+1个字符的后缀自动机,什么需要改变呢? 首先,子串$[0,L+1)$对应的状态不存 ...
- BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 字符串 SAM
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3926.html 题目传送门 - BZOJ3926 题意 给定一个有 $n$ 个节点,最多只有 $20$ ...
- BZOJ3926:[ZJOI2015]诸神眷顾的幻想乡(广义SAM)
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- [BZOJ3926][ZJOI2015]诸神眷顾的幻想乡(后缀自动机)
日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去 ...
- BZOJ3926 Zjoi2015 诸神眷顾的幻想乡【广义后缀自动机】
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 【广义后缀自动机】
题目 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴 ...
- BZOJ3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- BZOJ3926 ZJOI2015诸神眷顾的幻想乡(广义后缀自动机)
对多串建立SAM的一种方法是建trie再对trie建SAM.构造方式分为在线(也即不建trie而是依次插入每个串,或在trie上dfs)和离线(也即建好trie再bfs).其中离线构造与单串的构造方式 ...
- bzoj3926: [Zjoi2015]诸神眷顾的幻想乡
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- BZOJ3926 ZJOI2015 诸神眷顾的幻想乡 Trie、广义SAM
传送门 树上的任意一条路径一定会在以某一个叶子节点为根的树上成为一条直上直下的链,而总共只有\(20\)个叶子节点. 于是每一次选所有叶子节点中的一个作为根,形成一个\(Trie\),把\(20\)个 ...
随机推荐
- [朴孝敏][Sketch]
歌词来源:http://music.163.com/#/song?id=406907303 作曲 : Ryan S. Jhun/August Rigo/Denzil Remedios [作曲 : Ry ...
- webpack入门指南-step02
webpack 安装 1)安装前的准备:webpack是基于node环境的项目,所以使用前必须先安装node和npm. 在安装 Webpack 前,你本地环境需要支持 node.js.如果电脑没有装过 ...
- string类型的常用方法
1. 在尾部插入/删除元素 string s("hello"); // 插入/删除一个字符 s.push_back('!'); s.pop_back(); // 插入多个字符 s. ...
- PowerDesgner的视图显示设置教程
一.简介 PowerDesgner是一款实用的数据库原型设计软件,但一些新手往往会觉得不好上手,应小伙伴需要,整理了一下PowerDesgner的视图显示设置教程: 首先,PowerDesgner的数 ...
- Last Daily Scrum (2015/11/9)
今晚我们终于完成了新版本的爬虫工作,可以替换掉之前部署在服务器上的那个爬虫了.由于周末大家各种原因导致了我们迭代一的截止日没有完成所有任务,所以今天晚上大家加班加点终于把这一迭代的爬虫项目完成了. 成 ...
- 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-最后阶段
2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-最后阶段 最后的一周,时间越来越紧张,因为之前的拖沓和一些事情的耽误,导致了如今的紧张,这一周应该是我们小组效率最高 ...
- Chapter 9 软件实现
软件实现包括代码设计.设计审查.代码编写.代码走查.代码编译和单元测试等活动.程序设计语言有很多,从机器语言到高级语言一直发展.软件编码需要遵循一些规范,JAVA代码有适当的空行,代码行及行内空格.分 ...
- 项目Beta冲刺团队随笔集
博客集如下: Beta冲刺Day1:第一天冲刺记录 Beta冲刺Day2:第二天冲刺记录 Beta冲刺Day3:第三天冲刺记录 Beta冲刺Day4:第四天冲刺记录 Beta冲刺Day5:第五天冲刺记 ...
- 用delphi开发activex打印控件
http://blog.csdn.net/baronyang/article/details/4465468
- Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)
文章转自:http://www.ibm.com/developerworks/cn/java/j-lo-keyboard/