#include #define endl '\n' #define pb push_back using namespace std; const int maxn = 7e3 + 10; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } int rad[maxn]; int n; char a[maxn]; vector < int > g[maxn]; int p[maxn], depth[maxn]; int jump[maxn][maxn]; void dfs(int beg, int from) { depth[beg] = depth[from] + 1; p[beg] = from; for (auto nb: g[beg]) { if(nb == from)continue; dfs(nb, beg); } } void fill_jump() { for (int i = 2; i <= n; ++ i) jump[i][0] = p[i]; for (int j = 1; j < 15; ++ j) { for (int i = 1; i <= n; ++ i) jump[i][j] = jump[jump[i][j-1]][j-1]; } } int moveup(int v, int x) { for (int i = 15 - 1; i >= 0; -- i) { if((1 << i) & x) { v = jump[v][i]; } } return v; } int findlca(int v, int u) { int onv = depth[v], onu = depth[u]; if(onv > onu)v = moveup(v, onv - onu); else u = moveup(u, onu - onv); if(u == v)return u; int v0, u0; for (int i = 15 - 1; i >= 0; -- i) { v0 = moveup(v, (1 << i)); u0 = moveup(u, (1 << i)); if(v0 > 0 && u0 > 0 && v0 != u0) { v = v0; u = u0; } } return p[v]; } void read_graph() { cin >> n; for (int i = 1; i <= n; ++ i) cin >> a[i]; for (int i = 1; i < n; ++ i) { int from, to; cin >> from >> to; g[from].pb(to); g[to].pb(from); } dfs(1, 0); } long long solve(string&s) { long long ans = 0; string t = "S"; for (auto x: s) { t += "#"; t += x; } t += "#F"; int len = t.size(); for (int i = 0; i <= len; ++ i) rad[i] = 0; int best = 0, rt = 0; int pos; for (int i = 1; i < len-1; i++) { pos = 2*best - i; rad[i] = min(max(0, rt - i), rad[pos]); while (i - rad[i] - 1 >= 0 && t[i + rad[i] + 1] == t[i - rad[i] - 1]) rad[i] ++; if (i+rad[i] > rt) /// imame nov rt { best = i; rt = i+rad[i]; } ans += (rad[i]+1)/2; } return ans; } int main() { freopen("ferrari.in", "r", stdin); freopen("ferrari.out", "w", stdout); speed(); read_graph(); fill_jump(); int q; cin >> q; while(q --) { int u, v; cin >> u >> v; int lca = findlca(u, v); string s = "", down = ""; int ver = u; while(ver != lca) { s += a[ver]; ver = p[ver]; } s += a[lca]; ver = v; while(ver != lca) { down += a[ver]; ver = p[ver]; } for (int i = down.size()-1; i >= 0; -- i) s += down[i]; cout << solve(s) << endl; } return 0; }