写法是dfs加在线add,但是阳历没过
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int ch[N*20][10],len[N*20],fa[N*20],tot=1,a[N],head[N],deg[N],num;
struct edge{
int to,next;
}g[N*2];
void addd(int u,int v)
{
num++;
g[num].to=v;
g[num].next=head[u];
head[u]=num;
}
int add(int las,int c)
{
if(ch[las][c])
{
int q=ch[las][c],p=las;
if(len[q]==len[p]+1)
return q;
else
{
int nq=++tot;
for(int i=0;i<26;i++)
ch[nq][i]=ch[q][i];
fa[nq]=fa[q];
len[nq]=len[p]+1;
for(;p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
fa[q]=nq;
return nq;
}
}
int np=++tot,p=las;
len[np]=len[p]+1;
for(;p&&ch[p][c]==0;p=fa[p]) ch[p][c]=np;
if(p==0)
{
fa[np]=1;
return np;
}
int q=ch[p][c];
if(len[q]==len[p]+1)
{
fa[np]=q;
return np;
}
int nq=++tot;
for(int i=0;i<26;i++)
ch[nq][i]=ch[q][i];
len[nq]=len[p]+1;
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for(;p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
return np;
}
void dfs(int u,int fa,int las)
{
//cout<<u<<' ';
int lst=add(las,a[u]);
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(v==fa) continue;
dfs(v,u,lst);
}
}
int main()
{
int n,c;
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i];
int u,v;
for(int i=1;i<n;i++)
{
cin>>u>>v;
addd(u,v);
addd(v,u);
deg[u]++,deg[v]++;
}
for(int i=1;i<=n;i++)
{
if(deg[i]==1)
dfs(i,-1,1);
}
// cout<<tot<<endl;
long long ans=0;
for(int i=1;i<=tot;i++)
ans+=len[i]-len[fa[i]];
cout<<ans;
}