#include #include #include using namespace std; int n, sol; char s[100005]; int level[100005], viz[100005]; long long pow1[100005], pow2[100005]; vector v[100005]; const long long mod1 = 1000000007; const long long mod2 = 1000000000 * (long long)10 + 3; void dfs (int nod, long long ohash1, long long ohash2, long long ohash3, long long ohash4) { long long hash1 = (ohash1 * 29 + s[nod]) % mod1; long long hash2 = (ohash2 + pow1[level[nod]] * s[nod]) % mod1; if (hash1 == hash2) sol = max (sol, level[nod]); long long hash3 = (ohash3 * 31 + s[nod]) % mod2; long long hash4 = (ohash4 + pow2[level[nod]] * s[nod]) % mod2; if (hash3 == hash4) sol = max (sol, level[nod]); viz[nod] = 1; for (vector :: iterator it = v[nod].begin(); it != v[nod].end(); it ++) if (!viz[*it]) { level[*it] = level[nod] + 1; dfs (*it, hash1, hash2, hash3, hash4); } } int main () { #ifndef ONLINE_JUDGE freopen ("mind4.in", "r", stdin); freopen ("mind4.out", "w", stdout); #endif int t, i, x, y; scanf ("%d\n", &t); pow1[0] = pow2[0] = 1; for (i = 1; i <= 100000; i ++) { pow1[i] = (pow1[i - 1] * 29) % mod1; pow2[i] = (pow2[i - 1] * 31) % mod2; } while (t --) { memset (viz, 0, sizeof (viz)); sol = 0; scanf ("%d\n", &n); gets (s + 1); for (i = 1; i <= n; i ++) { s[i] -= 'a' - 1; v[i].clear(); } for (i = 1; i < n; i ++) { scanf ("%d %d\n", &x, &y); v[x].push_back (y); v[y].push_back (x); } dfs (1, 0, 0, 0, 0); printf ("%d", sol + 1); if (t) printf ("\n"); } return 0; }