[Zjoi2015]诸神眷顾的幻想乡

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 1537  Solved: 892

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%的数据,除某两块空地与三个空地相邻外,其他空地都分别至多与两个空地相邻。

思路

题中最后一句话的意思是,叶子数不超过20;
于是,以每个叶子为根,找出可能的长字符串;
并用这些字符串构建后缀自动机,统计ans;

代码实现

 1 #include<cstdio>
 2 const int maxn=1e5+1;
 3 int n,m,l,tot;
 4 int r[maxn],c[maxn];
 5 int t[maxn<<1],next[maxn<<1],last[maxn];
 6 struct note{int son[12],pr,len;}sam[maxn*20];
 7 void add(int x,int y){t[++l]=y,next[l]=last[x],last[x]=l;}
 8 int extend(int x,int p){
 9     int np=++tot;
10     sam[np].len=sam[p].len+1;
11     while(!sam[p].son[x]&&p) sam[p].son[x]=np,p=sam[p].pr;
12     if(p){
13         int q=sam[p].son[x];
14         if(sam[q].len==sam[p].len+1) sam[np].pr=q;
15         else{
16             int nq=++tot;
17             sam[nq]=sam[q];
18             sam[nq].len=sam[p].len+1;
19             sam[q].pr=sam[np].pr=nq;
20             while(p&&sam[p].son[x]==q) sam[p].son[x]=nq,p=sam[p].pr;
21         }
22     }
23     else sam[np].pr=1;
24     return np;
25 }
26 void dfs(int x,int y,int l){
27     int la=extend(c[x],l);
28     for(int i=last[x];i;i=next[i])
29     if(t[i]!=y) dfs(t[i],x,la);
30 }
31 int main(){
32     int a,b;
33     scanf("%d%d",&n,&m);
34     tot=1;
35     for(int i=1;i<=n;i++) scanf("%d",&c[i]);
36     for(int i=1;i<n;i++){
37         scanf("%d%d",&a,&b);
38         add(a,b),add(b,a);
39         r[a]++,r[b]++;
40     }
41     for(int i=1;i<=n;i++) if(r[i]==1) dfs(i,0,1);
42     long long ans=0;
43     for(int i=1;i<=tot;i++) ans+=sam[i].len-sam[sam[i].pr].len;
44     printf("%lld\n",ans);
45     return 0;
46 }

转载于:https://www.cnblogs.com/J-william/p/7351597.html

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

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

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

  2. bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. word2010多级列表编号变成黑块的解决方案
  2. [转帖]最值得了解的10大开源技术
  3. linux 查看cpu_作为高级Java,你应该了解的Linux知识
  4. Taro+react开发(30)引入静态资源地址
  5. webview代码实例化_WebView常用类和基本方法详解
  6. c语言删标点,C程序中文标点惹的祸,你可长点儿心吧
  7. Google人工智能面试·真·题(附参考答案+攻略)
  8. php没有输出报错信息的解决
  9. Iplimage设置感兴趣区域(ROI)
  10. [T-ARA/筷子兄弟][Little Apple]
  11. 网友在各自领域中所用到的芯片总结(转载)
  12. 创建局域网Git服务器
  13. 头条App项目测试实战(七)实名认证功能用例设计
  14. 揭秘 手机群控 带来的利益
  15. 怎么改锁定计算机的背景,电脑修改登录界面背景壁纸的操作方法
  16. Variant类型在各语言中的参数传递
  17. ajax传递数组怎么办?
  18. 望尽天涯路--从理财角度看高可用
  19. uni-app 使用 jsencrypt
  20. 关于c语言中 scanf 对多行字符的输入问题

热门文章

  1. 【建站系列教程】6、.htaccess文件的url重写规则-网页伪静态化
  2. 人群计数--Single-Image Crowd Counting via Multi-Column Convolutional Neural Network
  3. vscode 使用ssh密钥登录远程Linux -- vscode remote linux ssh key
  4. oracle 开窗子句,分析函数和开窗函数
  5. APUE(第九章)进程关系
  6. linux磁盘i o跟踪,利用zabbix动态监控磁盘I/O
  7. 【RocketMQ工作原理】订阅关系的一致性
  8. Elasticsearch之Mapping
  9. vue 拷贝 数组_Vue实现对数组、对象的深拷贝、复制
  10. oracle procedures批量删除带索引条件数据很慢_见微知著,数据库应用设计优化浅谈...