【ZJOI2015】诸神眷顾的幻想乡

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\le n\le 100000, 1\le c\le 10\)。

对于\(15\%\)的数据,\(n\le 2000\)。

另有\(5\%\)的数据,所有空地都至多与两个空地相邻。

另有\(5\%\)的数据,除一块空地与三个空地相邻外,其他空地都分别至多与两个空地相邻。

另有\(5\%\)的数据,除某两块空地与三个空地相邻外,其他空地都分别至多与两个空地相邻


压根没搞懂什么是对的广义SAM,什么是错的广义SAM,我的代码说不定是假的。

具体思路,直接对每个度为1的点建广义SAM,就是每次处理的las是原树父亲节点建出的那个点要处理,其他和SAM一样。直接把所有点的广义SAM建到一起就行了。

感觉还是要看统计的是什么,大家可以看看这个数据

2 1
0 0
1 2

SAM长这个鬼样子

嗯,感觉这个len就很对了吧,虽然感觉状态一样的节点很诡异


Code:

#include <cstdio>
#include <cstring>
#define ll long long
const int N=1e5+10;
const int M=4e6+10;
int ch[M][10],len[M],par[M],tot=1;
int in[N],s[N];
int extend(int p,int c)
{
int now=++tot;
len[now]=len[p]+1;
while(p&&!ch[p][c]) ch[p][c]=now,p=par[p];
if(!p) par[now]=1;
else
{
int x=ch[p][c];
if(len[x]==len[p]+1) par[now]=x;
else
{
int y=++tot;
len[y]=len[p]+1,par[y]=par[x];
memcpy(ch[y],ch[x],sizeof ch[x]);
while(p&&ch[p][c]==x) ch[p][c]=y,p=par[p];
par[now]=par[x]=y;
}
}
return now;
}
int head[N],to[N<<1],Next[N<<1],cnt;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
void dfs(int now,int fa,int las)
{
int bee=extend(las,s[now]);
for(int v,i=head[now];i;i=Next[i])
if((v=to[i])^fa)
dfs(v,now,bee);
}
int main()
{
int n,c;scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++) scanf("%d",s+i);
for(int u,v,i=1;i<n;i++) scanf("%d%d",&u,&v),++in[u],++in[v],add(u,v),add(v,u);
for(int i=1;i<=n;i++) if(in[i]==1) dfs(i,0,1);
ll ans=0;
for(int i=1;i<=tot;i++) ans=ans+len[i]-len[par[i]];
printf("%lld\n",ans);
return 0;
}

2019.1.10

【ZJOI2015】诸神眷顾的幻想乡 解题报告的更多相关文章

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

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1017  Solved: 599[Submit][S ...

  2. bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解

    先说一下对后缀自动机的理解,主要是对构造过程的理解. 构造中,我们已经得到了前L个字符的后缀自动机,现在我们要得到L+1个字符的后缀自动机,什么需要改变呢? 首先,子串$[0,L+1)$对应的状态不存 ...

  3. 【BZOJ 3926】 [Zjoi2015]诸神眷顾的幻想乡 (广义SAM)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 974  Solved: 573 Descriptio ...

  4. 字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 843  Solved: 510[Submit][St ...

  5. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 [广义后缀自动机 Trie]

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1124  Solved: 660[Submit][S ...

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

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

  7. bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机)

    bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机) bzoj Luogu 题解时间 给你个无根trie树(你管这叫trie树?),问你选取一条 ...

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

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

  9. BZOJ3926:[ZJOI2015]诸神眷顾的幻想乡(广义SAM)

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

随机推荐

  1. 【LeetCode9】Palindrome Number★

    题目描述: 解题思路: 求回文数,并且要求不能使用额外的空间.思路很简单,算出x的倒置数reverse,比较reverse是否和x相等就行了. Java代码: public class LeetCod ...

  2. 20155204 王昊《网络对抗技术》EXP4

    20155204 王昊<网络对抗技术>EXP4 一.实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有 ...

  3. Exp9 Web安全基础实践

    Exp9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? 对用户的输入进行校验,可以通过正则表达式,双"-"进行转换等. 不要使用动态拼装sql,可以使用参数 ...

  4. 让vim成为VS的编辑器

    编辑代码是还是感觉vim的比较方便--于是让vim成为VS的编辑器. 发现,安装了VsVim之后,也不失VS的便捷性,相当不错呢-- 对了我用的是VS2012---- 1.菜单栏->工具-> ...

  5. libgdx学习记录10——Particle粒子

    粒子对制作画面特效很有用,可以使用Particle Editor进行自行编辑粒子效果,跟图片一起生成.p粒子文件,然后导入到程序中使用. 本文所用的粒子效果是基于其自带的demo的. 实例: pack ...

  6. QT要点

    1. QT设计器最终会被解释为ui_**.h. 2. QString与init之间的转换: QString转int: bool bIsOk; int a = str.toInt( &bIsOk ...

  7. Visual Studio Package 插件开发(Visual Studio SDK)

    背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包“不亦乐乎”...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一个,干嘛不用持续集成 ...

  8. 【ORACLE】Win2008R2修改oracle数据库实例名

    需求说明:要求将windows平台的数据库实例名由orcl改为haha 参考: https://www.cnblogs.com/junnor/archive/2013/03/05/2945245.ht ...

  9. linux centos 中Tomcat的安装和自启动配置

    Tomcat的安装和自启动配置将tomcat添加为linux系统服务,网上找到了很多方法,其中比较简单的如下:方法一:(亲测有效)1. 首先需要将$Tomcat_HOME/bin目录下的catalin ...

  10. HyperLedger Fabric 学习思路分享

    HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常 ...