bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 4000005 using namespace std; int n,v[N],du[N],head[N],ver[N],nxt[N],tot; void add( int a, int b) { tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b; return ; } int now[N],root,fa[N],ch[N][11],cnt,l[N]; void insert( int p, int c) { int np=++cnt;l[np]=l[p]+1; while (p&&!ch[p][c])ch[p][c]=np,p=fa[p]; if (!p)fa[np]=1; else { int q=ch[p][c]; if (l[q]==l[p]+1)fa[np]=q; else { int nq=++cnt;l[nq]=l[p]+1; fa[nq]=fa[q]; fa[np]=fa[q]=nq; for ( int i=0;i<10;i++)ch[nq][i]=ch[q][i]; while (p&&ch[p][c]==q)ch[p][c]=nq,p=fa[p]; } } } void dfs( int x, int f, int y) { now[x]=y; for ( int i=head[x];i;i=nxt[i]) { if (ver[i]==f) continue ; insert(y,v[ver[i]]); dfs(ver[i],x,ch[y][v[ver[i]]]); } } int main() { int c; scanf ( "%d%d" ,&n,&c); for ( int i=1;i<=n;i++) scanf ( "%d" ,&v[i]); int t1,t2; for ( int i=1;i<n;i++) { scanf ( "%d%d" ,&t1,&t2); add(t1,t2);add(t2,t1); du[t1]++;du[t2]++; } cnt=1; for ( int i=1;i<=n;i++) if (du[i]==1)add(0,i); dfs(0,-1,1); long long ans=0; for ( int i=2;i<=cnt;i++)ans+=l[i]-l[fa[i]]; printf ( "%lld\n" ,ans); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· 盘点!HelloGitHub 年度热门开源项目
· DeepSeek V3 两周使用总结
· 02现代计算机视觉入门之:什么是视频
· C#使用yield关键字提升迭代性能与效率
· 2. 什么?你想跨数据库关联查询?