#include <algorithm> #include <iostream> #include <string> #include <cstring> #include <vector> using namespace std; const int NMAX = 200000; char s[NMAX+2]; int ad[NMAX+2]; int viz[NMAX+2]; int lgmax= 1; int T, N; vector <int> g[NMAX+2]; vector <int> v,dub; inline void init() { lgmax= -1; for( int i= 1; i<=NMAX; ++i ) { g[i].clear(); viz[i]= 0; } v.clear(); } void dfs(int nod){ int lg= (int)g[nod].size(); v.push_back( ad[ nod ] ); dub= v; reverse( dub.begin(), dub.end() ); if( dub == v ) { lgmax= max( lgmax, (int)dub.size() ); } for(int i= 0; i<lg; i++){ if( viz[ g[nod][i] ]==0 ){ viz[ g[nod][i] ]= 1; dfs( g[ nod ][i] ); } } v.pop_back(); } inline void Rezolva() { dfs( 1 ); cout << lgmax << '\n'; } int main() { cin >> T; for( int t= 0; t<T; ++t ) { init(); cin >> N; cin >> s; for( int i= 0; i<N; ++i ) { ad[ i+1 ]= s[i]-'a'; } for( int i= 1; i<N; ++i ) { int a,b; cin >> a >> b; g[a].push_back( b ); g[b].push_back( a ); } Rezolva(); } return 0; }