1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 #include<queue>
7 #include<cmath>
8 #include<set>
9 using namespace std;
10 #define Maxn 100010
11 #define LL long long
12
13 struct node
14 {
15 int step,pre,son[15];
16 }t[40*Maxn];int tot=0;
17 int last;
18
19 struct hp
20 {
21 int x,y,next;
22 }a[2*Maxn];int al=0;
23
24 int col[Maxn],fa[Maxn],first[Maxn],rd[Maxn];
25
26 void ins(int x,int y)
27 {
28 a[++al].x=x;a[al].y=y;
29 a[al].next=first[x];first[x]=al;
30 }
31
32 void upd(int x)
33 {
34 memset(t[x].son,0,sizeof(t[x].son));
35 t[x].pre=0;
36 }
37
38 int extend(int k)
39 {
40 int np=++tot;upd(tot);
41 t[np].step=t[last].step+1;
42 int now=last;
43 while(now&&!t[now].son[k])
44 {
45 t[now].son[k]=np;
46 now=t[now].pre;
47 }
48 if(!now) t[np].pre=1;
49 else
50 {
51 int p=now,q=t[now].son[k];
52 if(t[p].step+1==t[q].step) t[np].pre=q;
53 else
54 {
55 int nq=++tot;
56 upd(tot);
57 memcpy(t[nq].son,t[q].son,sizeof(t[nq].son));
58 t[nq].pre=t[q].pre;
59 t[q].pre=t[np].pre=nq;
60 t[nq].step=t[p].step+1;
61 while(now&&t[now].son[k]==q)
62 {
63 t[now].son[k]=nq;
64 now=t[now].pre;
65 }
66 }
67 }
68 last=np;
69 return np;
70 }
71
72 void dfs(int x,int f)
73 {
74 int now=extend(col[x]);
75 for(int i=first[x];i;i=a[i].next) if(a[i].y!=f)
76 {
77 last=now;
78 dfs(a[i].y,x);
79 }
80 }
81
82 int n,c;
83 void init()
84 {
85 scanf("%d%d",&n,&c);
86 for(int i=1;i<=n;i++) {scanf("%d",&col[i]);col[i]++;}
87 memset(first,0,sizeof(first));
88 memset(rd,0,sizeof(rd));
89 for(int i=1;i<n;i++)
90 {
91 int x,y;
92 scanf("%d%d",&x,&y);
93 rd[x]++;rd[y]++;
94 ins(x,y);ins(y,x);
95 }
96 t[++tot].step=0;
97 upd(tot);last=1;
98 for(int i=1;i<=n;i++) if(rd[i]==1)
99 {
100 dfs(i,0);
101 last=1;
102 }
103 }
104
105 int main()
106 {
107 init();
108 LL ans=0;
109 for(int i=1;i<=tot;i++) ans+=t[i].step-t[t[i].pre].step;
110 printf("%lld\n",ans);
111 return 0;
112 }