func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 3e5 + 5, MOD = 1e9 + 7;   char s[N], buf[1 << 20];   int ppp, qqq;   inline char gc() {     if (ppp == qqq) ppp = 0, qqq = fread(buf, 1, 1 << 20, stdin);     return buf[ppp++];   }   inline void rs() {     char x;     int t = 0;     while ((x = getchar()) <  a  || x >  z )       ;     s[++t] = x;     while ((x = getchar()) >=  a  && x <=  z ) s[++t] = x;   }   inline int rd() {     char x;     while ((x = getchar()) <  0  || x >  9 )       ;     int t = x -  0 ;     while ((x = getchar()) >=  0  && x <=  9 ) t = t * 10 + x -  0 ;     return t;   }   int bg[N], nx[N * 2], to[N * 2], tl, hs1[N], hs2[N], p29[N], pinv[N], lg2[N];   inline void add(int x, int y) {     nx[++tl] = bg[x];     bg[x] = tl;     to[tl] = y;   }   inline int qpow(int x, int y) {     int ret = 1;     while (y) {       if (y & 1) ret = 1ll * ret * x % MOD;       x = 1ll * x * x % MOD;       y >>= 1;     }     return ret;   }   int dep[N], mxd[N], son[N], top[N], up[N], dw[N], fa[N][20], num[N], dfn;   void dfs1(int now, int f, int depth) {     dep[now] = depth;     fa[now][0] = f;     mxd[now] = depth;     for (int i = 1; i < 20; i++) {       if (!fa[fa[now][i - 1]][i - 1]) break;       fa[now][i] = fa[fa[now][i - 1]][i - 1];     }     hs1[now] = (hs1[f] + 1ll * (s[now] -  a ) * p29[depth - 1]) % MOD;     hs2[now] = (29ll * hs2[f] + s[now] -  a ) % MOD;     for (int i = bg[now]; i; i = nx[i]) {       int aim = to[i];       if (aim == f) continue;       dfs1(aim, now, depth + 1);       if (mxd[aim] > mxd[son[now]]) son[now] = aim;       mxd[now] = max(mxd[now], mxd[aim]);     }   }   void dfs2(int now, int tp) {     top[now] = tp, num[now] = ++dfn;     if (now == tp) {       int len = mxd[now] - dep[now], tmp = now;       for (int i = 0; i <= len; i++) dw[dfn + i] = tmp, tmp = son[tmp];       tmp = now;       for (int i = 0; i <= len; i++) up[dfn + i] = tmp, tmp = fa[tmp][0];     }     if (son[now]) dfs2(son[now], tp);     for (int i = bg[now]; i; i = nx[i]) {       int aim = to[i];       if (aim == fa[now][0] || aim == son[now]) continue;       dfs2(aim, aim);     }   }   inline int lca(int x, int y) {     if (dep[x] < dep[y]) swap(x, y);     int i, dt = dep[x] - dep[y];     for (i = 0; i < dt; i++) {       if ((1 << i) > dt) break;       if ((1 << i) & dt) x = fa[x][i];     }     if (x == y) return x;     for (i = 19; i >= 0; i--) {       if (fa[x][i] == fa[y][i]) continue;       x = fa[x][i], y = fa[y][i];     }     return fa[x][0];   }   inline int kth_anc(int x, int k) {     if (k == 0) return x;     x = fa[x][lg2[k]], k -= 1 << lg2[k];     int tp = top[x], dt = dep[x] - dep[tp] - k;     if (dt >= 0)       return dw[num[tp] + dt];     else       return up[num[tp] - dt];   }   int main() {     int n = rd(), q, i;     rs();     for (i = 1; i < n; i++) {       int x = rd(), y = rd();       add(x, y), add(y, x);     }     p29[0] = pinv[0] = 1, lg2[0] = -1;     for (i = 1; i <= n; i++) {       p29[i] = 1ll * p29[i - 1] * 29 % MOD, pinv[i] = qpow(p29[i], MOD - 2);       lg2[i] = lg2[i >> 1] + 1;     }     dfs1(1, 0, 1);     dfs2(1, 1);     q = rd();     for (i = 1; i <= q; i++) {       int a = rd(), b = rd(), c = rd(), d = rd();       int ac1 = lca(a, b), ac2 = lca(c, d);       int len1 = dep[a] + dep[b] - dep[ac1] * 2 + 1,           len2 = dep[c] + dep[d] - dep[ac2] * 2 + 1;       int dis1 = dep[a] - dep[ac1] + 1, dis2 = dep[c] - dep[ac2] + 1;       int l = 1, r = min(len1, len2), ans = 0;       while (l <= r) {         int mid = (l + r) >> 1;         int h1 = 0, h2 = 0;         if (mid > dis1) {           int rem = mid - dis1;           int lf =               1ll * (hs1[a] - hs1[fa[ac1][0]] + MOD) * pinv[dep[ac1] - 1] % MOD;           int rp = kth_anc(b, dep[b] - dep[ac1] - rem);           int rt = (0ll + hs2[rp] -                     1ll * hs2[ac1] * p29[dep[rp] - dep[ac1]] % MOD + MOD) %                    MOD;           h1 = (1ll * lf * p29[rem] + rt) % MOD;         } else {           int lp = kth_anc(a, mid - 1);           h1 = 1ll * (hs1[a] - hs1[fa[lp][0]] + MOD) * pinv[dep[lp] - 1] % MOD;         }         if (mid > dis2) {           int rem = mid - dis2;           int lf =               1ll * (hs1[c] - hs1[fa[ac2][0]] + MOD) * pinv[dep[ac2] - 1] % MOD;           int rp = kth_anc(d, dep[d] - dep[ac2] - rem);           int rt = (0ll + hs2[rp] -                     1ll * hs2[ac2] * p29[dep[rp] - dep[ac2]] % MOD + MOD) %                    MOD;           h2 = (1ll * lf * p29[rem] + rt) % MOD;         } else {           int lp = kth_anc(c, mid - 1);           h2 = 1ll * (hs1[c] - hs1[fa[lp][0]] + MOD) * pinv[dep[lp] - 1] % MOD;         }         if (h1 == h2)           ans = mid, l = mid + 1;         else           r = mid - 1;       }       printf( %d n , ans);     }     return 0;   }   