#include #include #include #define maxn 100005 using namespace std; int n,sol; int viz[maxn]; char sir[maxn]; vectorG[maxn]; const int base = 73,mods = 4; int mod[mods] = {100003,100007,700001,700003},p[mods][maxn]; void dfs ( int nod , int niv , vector &H1 , vector &H2 ){ viz[nod] = 1; int pal = 1; vectornewH1(5,0),newH2(5,0); for ( int i = 0 ; i < mods ; ++i ){ newH1[i] = (H1[i] * base + sir[nod])%mod[i]; newH2[i] = (H2[i] + 1LL*p[i][niv-1]*sir[nod])%mod[i]; if ( newH1[i] != newH2[i] ) pal = 0; } if ( pal ) sol = max(sol,niv); for ( vector::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){ int fiu = (*itt); if ( !viz[fiu] ){ dfs(fiu,niv+1,newH1,newH2); } } } int main () { #ifndef ONLINE_JUDGE freopen("a.in","r",stdin); freopen("a.out","w",stdout); #endif for ( int i = 0 ; i < mods ; ++i ){ p[i][0] = 1; } for ( int i = 1 ; i <= 100000 ; ++i ){ for ( int j = 0 ; j < mods ; ++j ){ p[j][i] = (1LL*p[j][i-1]*base)%mod[j]; } } int tests; cin >> tests; while ( tests-- ){ cin >> n; cin >> (sir+1); int a,b; for ( int i = 1 ; i < n ; ++i ){ cin >> a >> b; G[a].push_back(b); G[b].push_back(a); } sol = 0; vectorH1(5,0),H2(5,0); dfs(1,1,H1,H2); cout << sol << "\n"; for ( int i = 1 ; i <= n ; ++i ){ G[i].clear(); viz[i] = 0; } } return 0; }