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

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 438  Solved: 273

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%的数据,除某两块空地与三个空地相邻外,其他空地都分别至多与两个空地相邻
解题:广义后缀自动机,陈老师的语文水平高

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn = 100010;
 5 vector<int>g[maxn];
 6 int du[maxn];
 7 struct SAM {
 8     struct node {
 9         int son[10],f,len;
10         void init(int _len = 0) {
11             memset(son,-1,sizeof son);
12             f = -1;
13             len = _len;
14         }
15     } e[4000010];
16     int tot,last;
17     int newnode(int len = 0) {
18         e[tot].init(len);
19         return tot++;
20     }
21     void init() {
22         tot = last = 0;
23         newnode();
24     }
25     int extend(int p,int c) {
26         int np = newnode(e[p].len + 1);
27         while(p != -1 && e[p].son[c] == -1) {
28             e[p].son[c] = np;
29             p = e[p].f;
30         }
31         if(p == -1) e[np].f = 0;
32         else {
33             int q = e[p].son[c];
34             if(e[p].len + 1 == e[q].len) e[np].f = q;
35             else {
36                 int nq = newnode();
37                 e[nq] = e[q];
38                 e[nq].len = e[p].len + 1;
39                 e[np].f = e[q].f = nq;
40                 while(p != -1 && e[p].son[c] == q) {
41                     e[p].son[c] = nq;
42                     p = e[p].f;
43                 }
44             }
45         }
46         return np;
47     }
48     LL count(LL ret = 0) {
49         for(int i = 1; i < tot; ++i)
50             ret += e[i].len - e[e[i].f].len;
51         return ret;
52     }
53 } sam;
54
55 int color[maxn];
56 void dfs(int u,int fa,int p){
57     int x = sam.extend(p,color[u]);
58     for(int i = g[u].size()-1; i >= 0; --i)
59         if(g[u][i] != fa) dfs(g[u][i],u,x);
60 }
61 int main() {
62     int n,c,u,v;
63     while(~scanf("%d%d",&n,&c)) {
64         sam.init();
65         for(int i = 0; i <= n; ++i) {
66             g[i].clear();
67             du[i] = 0;
68         }
69         for(int i = 1; i <= n; ++i)
70             scanf("%d",color + i);
71         for(int i = 1; i < n; ++i){
72             scanf("%d%d",&u,&v);
73             ++du[u];
74             ++du[v];
75             g[u].push_back(v);
76             g[v].push_back(u);
77         }
78         for(int i = 1; i <= n; ++i)
79             if(du[i] == 1) dfs(i,0,0);
80         printf("%lld\n",sam.count());
81     }
82     return 0;
83 }

View Code

转载于:https://www.cnblogs.com/crackpotisback/p/4912458.html

BZOJ 3926: [Zjoi20150]诸神眷顾的幻想乡相关推荐

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

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

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

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

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

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

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

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

  5. 【bzoj3926】[Zjoi20150]诸神眷顾的幻想乡 后缀自动机+trie

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

  6. BZOJ3926: [Zjoi20150]诸神眷顾的幻想乡

    这一题有点坑..注意longlong SAM裸题... #include<cstdio> #include<iostream> #include<cstring> ...

  7. bzoj3926【ZJOI2015】诸神眷顾的幻想乡

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

  8. 【BZOJ 3926】【ZJOI 2015】 诸神眷顾的幻想乡

    [BZOJ 3926/ZJOI 2015] 诸神眷顾的幻想乡 [广义SA/广义SAM] 没想到陈立杰居然玩旧作- 题意: \;\;\;\;啊?~幻想乡?~一个树状太阳花田上每个点都有人穿着 c c种颜 ...

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

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

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

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

最新文章

  1. 45.2mAP+155FPS! PP-YOLO来了, 精度速度双超YOLOv4
  2. 【PSO运输优化】基于MATLAB的PSO运输优化算法的仿真
  3. 如何让FPGA中的SPI与其他模块互动起来
  4. kafka 集群_单机版kafka集群部署
  5. PHPStorm自动添加命名空间
  6. wordvba编程代码大全_面向对象、设计原则、设计模式、编程规范、重构
  7. leetcode1414. 和为 K 的最少斐波那契数字数目(贪心算法)
  8. 工作196:注意接收数据的格式
  9. Continuous Laplacian, Functional Map, Spectral CNN
  10. 《数据结构》陈越课件重点总结
  11. 语音信号处理(九)——离散余弦变换
  12. 计算器如何输出log以2为底的对数(利用对数log换底公式)
  13. 2022年南京大学计算机考研复试考什么|考研复试时间
  14. 2022 分布式存储市场调研报告
  15. 苹果系统备份文件服务器地址,苹果备份文件在哪里?苹果怎样恢复备份
  16. Flash 特效原理 震动效果
  17. 优化源于99%的试验和1%的数据决策力
  18. 动手实践看懂深度学习的DP和DDP
  19. 友盟 集成到 java web_友盟消息推送SDK集成
  20. Java实现复数的加减乘除

热门文章

  1. 练习1,从文件到数据库
  2. iOS,QRCord(矩阵二维码)
  3. android获取Mac地址和IP地址
  4. MongoDB以Windows服务安装
  5. Crontab 实例
  6. arp***的判断与解决方案总结
  7. BZOJ3156 防御准备
  8. HDU5234 Happy birthday
  9. vue-cli2.0webpack的理解
  10. 微信小程序跳转微信小程序的实现