3926: [Zjoi2015]诸神眷顾的幻想乡

Time Limit: 10 Sec   Memory Limit: 512 MB
Submit: 1381   Solved: 811
[ Submit][ Status][ Discuss]

Description

幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日。

粉丝们非常热情,自发组织表演了一系列节目给幽香看。幽香当然也非常高兴啦。 
这时幽香发现了一件非常有趣的事情,太阳花田有n块空地。在过去,幽香为了方便,在这n块空地之间修建了n-1条边将它们连通起来。也就是说,这n块空地形成了一个树的结构。 
有n个粉丝们来到了太阳花田上。为了表达对幽香生日的祝贺,他们选择了c中颜色的衣服,每种颜色恰好可以用一个0到c-1之间的整数来表示。并且每个人都站在一个空地上,每个空地上也只有一个人。这样整个太阳花田就花花绿绿了。幽香看到了,感觉也非常开心。 
粉丝们策划的一个节目是这样的,选中两个粉丝A和B(A和B可以相同),然后A所在的空地到B所在的空地的路径上的粉丝依次跳起来(包括端点),幽香就能看到一个长度为A到B之间路径上的所有粉丝的数目(包括A和B)的颜色序列。一开始大家打算让人一两个粉丝(注意:A,B和B,A是不同的,他们形成的序列刚好相反,比如红绿蓝和蓝绿红)都来一次,但是有人指出这样可能会出现一些一模一样的颜色序列,会导致审美疲劳。 
于是他们想要问题,在这个树上,一共有多少可能的不同的颜色序列(子串)幽香可以看到呢? 
太阳花田的结构比较特殊,只与一个空地相邻的空地数量不超过20个。 

Input

第一行两个正整数n,c。表示空地数量和颜色数量。

第二行有n个0到c-1之间,由空格隔开的整数,依次表示第i块空地上的粉丝的衣服颜色。(这里我们按照节点标号从小到大的顺序依次给出每块空地上粉丝的衣服颜色)。 
接下来n-1行,每行两个正整数u,v,表示有一条连接空地u和空地v的边。 

Output

一行,输出一个整数,表示答案。

Sample Input

7 3
0 2 1 2 1 0 0
1 2
3 4
3 5
4 6
5 7
2 5

Sample Output

30

HINT

对于所有数据,1<=n<=100000, 1<=c<=10。

对于15%的数据,n<=2000。 
另有5%的数据,所有空地都至多与两个空地相邻。 
另有5%的数据,除一块空地与三个空地相邻外,其他空地都分别至多与两个空地相邻。 
另有5%的数据,除某两块空地与三个空地相邻外,其他空地都分别至多与两个空地相邻

Source

【分析】

摔。为什么大家写的广义后缀自动机都不一样啊QAQ

【代码】

//bzoj 诸神眷顾的幻想乡
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=4000005;
ll ans;
int n,m,len,tot,cnt,root;
int head[mxn],du[mxn],s[mxn],step[mxn],pre[mxn],son[mxn][10];
struct edge {int to,next;} f[mxn];
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<<1)+(x<<3)+ch-'0',ch=getchar();return x*f;
}
inline void add(int u,int v)
{f[++cnt].to=v,f[cnt].next=head[u],head[u]=cnt;
}
inline int sam(int p,int c)
{int np=(++tot);step[np]=step[p]+1;while(p && !son[p][c])son[p][c]=np,p=pre[p];if(!p) {pre[np]=root;return np;}int q=son[p][c];if(step[q]==step[p]+1) pre[np]=q;else{int nq;step[nq=(++tot)]=step[p]+1;memcpy(son[nq],son[q],sizeof son[q]);pre[nq]=pre[q];pre[np]=pre[q]=nq;while(p && son[p][c]==q)son[p][c]=nq,p=pre[p];}return np;
}
inline void dfs(int u,int fa,int p)
{p=sam(p,s[u]);for(int i=head[u];i;i=f[i].next){int v=f[i].to;if(v!=fa) dfs(v,u,p);}
}
int main()
{int i,j,u,v;n=read(),m=read();fo(i,1,n) s[i]=read();fo(i,2,n){u=read(),v=read();add(u,v),add(v,u);du[u]++,du[v]++;}tot=root=1;fo(i,1,n) if(du[i]==1) dfs(i,0,1);fo(i,2,tot) ans+=step[i]-step[pre[i]];printf("%lld\n",ans);return 0;
}

bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡相关推荐

  1. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 1009   Solved: 596 [ Subm ...

  2. 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

    Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...

  3. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡

    这道题首先要读明白题,就是说叶子节点不超过20个,那么我们就可以以每一个叶子节点为根建一个广义后缀自动机,这样就一定能表示出来所有的子串,然后统计一下答案就可以啦. (广义后缀自动机就是把好多串放到一 ...

  4. [Zjoi2015]诸神眷顾的幻想乡

    [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1537  Solved: 892 Description 幽香 ...

  5. 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

    [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...

  6. [ZJOI2015] 诸神眷顾的幻想乡

    P3256[ZJOI2015 Day1]诸神眷顾的幻想乡 时间限制 : 20000 MS   空间限制 : 524288 KB 问题描述 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生 ...

  7. [bzoj3926][Zjoi2015]诸神眷顾的幻想乡

    来自FallDream的博客,未经允许, 请勿转载,谢谢. 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情 ...

  8. [洛谷P3346][ZJOI2015]诸神眷顾的幻想乡

    题目大意:给你一棵$n$个点的树,最多有$20$个叶子节点,问共有几个不同的子串 题解:广义$SAM$,对每个叶子节点深搜一次,每个节点的$lst$设为这个节点当时的父亲,这样就可以时建出来的$SAM ...

  9. Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机

    题目链接 \(Click\) \(Here\) 真的是好题啊-不过在说做法之前先强调几个自己总是掉的坑点. 更新节点永远记不住往上跳\(p = fa[p]\) 新建节点永远记不住\(len[y] = ...

最新文章

  1. 清华计算机学院新成立,清华AI更进一步:清华大学成立人工智能国际治理研究院...
  2. GO语言编程基础-复合类型结构体
  3. WCF服务重构实录(上)
  4. 屏幕截图在网页设计中应用的30个优秀案例
  5. 问答中心html,html
  6. C语言中compile time assert的实现
  7. 理解交通行业规律 用持续做“重”来重新定义共享出行
  8. 介绍一些好用的ArcToolbox工具(默认ArcGIS没有)
  9. dialog能提交数据吗_你的数据库,能撑起多少并发,有数吗?
  10. javascript 嵌入python_通过Python将区块链数据嵌入Javascript,这是正确的方法吗?
  11. NET 下数据库图片的存入与读取
  12. php yaf.dll,windows下配置nginx+php+yaf的环境
  13. win下hadoop配置环境后cmd中报错
  14. RSA系列第2篇:RSA 加密解密
  15. 工程项目成本管控,不知从何下手?
  16. 游戏史上80重要创新(原资料来自17173)
  17. Machine Learning系列--L0、L1、L2范数
  18. 在线API文档、技术文档工具ShowDoc
  19. ![CDATA[]]和转义字符
  20. 1065 浙江中医药大学ACM OJ

热门文章

  1. flutter 弹出框键盘遮挡 获取键盘高度
  2. Centos卸载rpm安装软件
  3. 分页查询,但是页面只重复显示一条数据
  4. 圆周率科技亮相2021世界VR产业博览会
  5. 微信开放JS SDK,这场web巨变意味着什么?
  6. 微信小程序for循环,多层嵌套for循环
  7. 百姓基因快讯:基因检测可以诊断出哪些类型的疾病?
  8. Python获取城市列表
  9. 【自定义控件】五角星、蜘蛛网
  10. 【云原生之Docker实战】使用Docker部署Ubooquity个人漫画服务器