#include<cstdio> #include<vector> #include<cstring> #include<cmath> #include<queue> #include<set> #include<algorithm> #include<ctime> #include<cstdlib> using namespace std; int Cat,x11,y11,maxi,Te,l,DD,TT,x,y,i,n,ap[100009],t[100009],T[100009][18],D[100009][18],pw[100009],h[100009],V[100009]; char a[100009]; vector < int > muc[100009],v[100009]; vector < int > :: iterator it; void dfs(int nod) { vector < int > :: iterator it; for(it=muc[nod].begin();it!=muc[nod].end();it++) if(ap[*it]==0) { ap[*it]=1; t[*it]=nod; h[*it]=h[nod]+1; v[nod].push_back(*it); dfs(*it); } } void Dp(int nod) { vector < int > :: iterator it; if(nod!=1) { V[nod]=(V[t[nod]]+1LL*pw[h[nod]-1]*a[nod])%y; T[nod][0]=t[nod]; D[nod][0]=a[t[nod]]; for(i=1;(1<<i)<h[nod];i++) { T[nod][i]=T[T[nod][i-1]][i-1]; D[nod][i]=(D[nod][i-1]+1LL*D[T[nod][i-1]][i-1]*pw[1<<(i-1)])%y; } } for(it=v[nod].begin();it!=v[nod].end();it++) Dp(*it); } void CC(int nod,int poz) { DD=a[nod]; TT=nod; l=1; for(int i=16;i>=0;i--) if(poz&(1<<i)) { DD=(DD+1LL*pw[l]*D[TT][i])%y; TT=T[TT][i]; l+=1<<i; } } int main() { //freopen("input","r",stdin); //freopen("output","w",stdout); scanf("%d",&Te); x=666013; y=1000007; pw[0]=1; for(i=1;i<=100000;i++) pw[i]=(1LL*pw[i-1]*x)%y; while(Te) { Te--; scanf("%d\n",&n); gets(a+1); for(i=1;i<=n;i++) v[i].clear(),muc[i].clear(),ap[i]=0; for(i=1;i<n;i++) { scanf("%d",&x11); scanf("%d",&y11); muc[x11].push_back(y11); muc[y11].push_back(x11); } ap[1]=h[1]=1; dfs(1); V[1]=a[1]; Dp(1); maxi=1; for(i=1;i<=n;i++) { if(h[i]%2==0) { Cat=h[i]/2-1; CC(i,Cat); if(DD==V[t[TT]]&&h[i]>maxi) maxi=h[i]; } else { Cat=h[i]/2; CC(i,Cat); if(DD==V[TT]&&h[i]>maxi) maxi=h[i]; } } printf("%d\n",maxi); } return 0; }