luogu3346 诸神眷顾的幻想乡 (广义SAM)

首先,让每一个叶节点做一次树根的话,每个路径一定至少有一次会变成直上直下的

于是对于每个叶节点作为根产生的20个trie树,把它们建到同一个广义SAM里

建法是对每个trie dfs去建,last就是父亲的那个节点;每次做一个新trie时,last给成root

然后答案就是每个节点表示的长度和

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define CLR(a,x) memset(a,x,sizeof(a))
 4 #define MP make_pair
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn=1e5+10,maxp=4e6+10;
 8
 9 inline char gc(){
10     return getchar();
11     static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;
12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;
13 }
14 inline ll rd(){
15     ll x=0;char c=gc();bool neg=0;
16     while(c<‘0‘||c>‘9‘){if(c==‘-‘) neg=1;c=gc();}
17     while(c>=‘0‘&&c<=‘9‘) x=(x<<1)+(x<<3)+c-‘0‘,c=gc();
18     return neg?(~x+1):x;
19 }
20
21 int N,C,eg[maxn*2][2],egh[maxn],ect,dgr[maxn];
22 int col[maxn];
23 int tr[maxp][12],fa[maxp],len[maxp],pct=1,rt=1;
24
25 inline void adeg(int a,int b){
26     eg[++ect][0]=b,eg[ect][1]=egh[a],egh[a]=ect;
27     dgr[a]++;
28 }
29
30 inline int insert(int x,int o){
31     int p=++pct;
32     len[p]=len[o]+1;
33     for(;o&&!tr[o][x];o=fa[o]) tr[o][x]=p;
34     if(!o){fa[p]=rt;return p;}
35     int q=tr[o][x];
36     if(len[q]==len[o]+1){fa[p]=q;return p;}
37     int qq=++pct;
38     memcpy(tr[qq],tr[q],sizeof(tr[qq]));
39     len[qq]=len[o]+1;fa[qq]=fa[q],fa[q]=fa[p]=qq;
40     for(;o&&tr[o][x]==q;o=fa[o]) tr[o][x]=qq;
41     return p;
42 }
43
44 inline void dfs(int x,int f,int p){
45     p=insert(col[x],p);
46     for(int i=egh[x];i;i=eg[i][1]){
47         int b=eg[i][0];if(b==f) continue;
48         dfs(b,x,p);
49     }
50 }
51
52 int main(){
53     //freopen("","r",stdin);
54     int i,j,k;
55     N=rd(),C=rd();
56     for(i=1;i<=N;i++) col[i]=rd();
57     for(i=1;i<N;i++){
58         int a=rd(),b=rd();
59         adeg(a,b);adeg(b,a);
60     }
61       for(i=1;i<=N;i++){
62           if(dgr[i]==1) dfs(i,0,rt);
63       }
64       ll ans=0;
65       for(i=2;i<=pct;i++) ans+=len[i]-len[fa[i]];
66     printf("%lld\n",ans);
67     return 0;
68 }

原文地址:https://www.cnblogs.com/Ressed/p/10205462.html

时间: 2024-10-27 14:07:18

luogu3346 诸神眷顾的幻想乡 (广义SAM)的相关文章

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

[BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建了n-1条边将它们连通起来.也就是说,这n块空地形成了一个树的结构. 有n个粉丝们来到了太阳花田上.为了表达对幽香生日的祝

bzoj 3926 [Zjoi20150]诸神眷顾的幻想乡(SAM)

3926: [Zjoi20150]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 615  Solved: 369[Submit][Status][Discuss] Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有

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

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44891009"); } 题意.题解.数据.出题人标程 http://wjmzbmr.com/archives/zjoi-2015-day-1%e9%a2%98%e8%a7%a3/26 本蒟蒻的题解: 首先我们发现叶子节点很少,所以可

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

https://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机是一种可以处理好多字符串的一种数据结构(不像后缀自动机只有处理一到两种的时候比较方便). 后缀自动机可以说是一种存子串的缩小点数的trie树,广义后缀自动机就是更改了一下塞点的方式让它可以塞多个子串. 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<

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

3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 974  Solved: 573 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建

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

3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 843  Solved: 510[Submit][Status][Discuss] Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n

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

3926: [Zjoi20150]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 438  Solved: 273 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修

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

3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1017  Solved: 599[Submit][Status][Discuss] Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有

【BZOJ3926】诸神眷顾的幻想乡(后缀自动机)

[BZOJ3926]诸神眷顾的幻想乡(后缀自动机) 题面 BZOJ 题解 广义后缀自动机啦 求多个串的不同子串个数? 当然是后缀自动机,最后只要把\(longest-parent.longest\)求个和就好啦 那么这题怎么建后缀自动机 能够把所有子串都丢进去呢? 当然不用从每一个节点开始 把树建出来之后,从每个叶子节点开始遍历一遍, 同时把遍历到的点查进\(SAM\)就行了 因为每个点的儿子数量最多只有\(20\) 这样叶子节点的数量就会很少 所以复杂度大概是\(O(nlog)\)级别的 空间