#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define MAXN 100050 #define HBASE 666013 int T, N, a, b; char S[MAXN]; vector A[MAXN]; unsigned long long P[MAXN]; int ans; void dfs(int node, int prev, int lvl, unsigned long long h, unsigned long long rh) { if(h == rh) ans = max(ans, lvl); for(vector :: iterator it = A[node].begin(); it != A[node].end(); it++) if(*it != prev) { int c = S[*it] - 'a'; unsigned long long nh = h * HBASE + c; unsigned long long nrh = rh + P[lvl] * c; dfs(*it, node, lvl + 1, nh, nrh); } } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); P[0] = 1; for(int i = 1; i < MAXN; i++) P[i] = P[i - 1] * HBASE; scanf("%d", &T); while(T--) { scanf("%d\n", &N); fgets(S, sizeof(S), stdin); for(int i = 0; i <= N; i++) A[i].clear(); for(int i = 0; i < N - 1; i++) { scanf("%d %d", &a, &b); a--; b--; A[a].push_back(b); A[b].push_back(a); } ans = 0; dfs(0, -1, 1, S[0] - 'a', S[0] - 'a'); printf("%d\n", ans); } return 0; }