真不知道错哪了 救救孩子罢
#include <bits/stdc++.h>
using namespace std;
int N, M;
string s;
int fa[100005][30], d[100005], H[100005], G[100005];
vector<int> son[100005];
void dfs(int now, int frt, int h, int g){
fa[now][0] = frt;d[now] = d[frt] + 1;
H[now] = h;G[now] = g;
if (s[now - 1] == 'H') H[now] = ++ h;
else G[now] = ++ g;
for (int i = 0; i < son[now].size(); i ++){
int nxt = son[now][i];
if (nxt == frt) continue;
dfs(nxt, now, h, g);
}
}
int LCA(int x, int y){
if (x == y) return x;
if (d[x] < d[y]) swap(x, y);
for (int i = 30; i >= 0; i --)
if (d[fa[x][i]] >= d[y]) x = fa[x][i];
if (x == y) return x;
for (int i = 30; i >= 0; i --)
if (fa[x][i] != fa[y][i])
x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
int main(){
cin >> N >> M;
cin >> s;
for (int i = 1; i < N; i ++){
int X, Y;cin >> X >> Y;
son[X].push_back(Y);
son[Y].push_back(X);
}
dfs(1, 0, 0, 0);
for (int k = 1; k <= 25; k ++)
for (int i = 1; i <= N; i ++)
fa[i][k] = fa[fa[i][k - 1]][k - 1];
while (M --){
int a, b, k1 = 0, k2 = 0;string c;
cin >> a >> b;
cin >> c;
int p = LCA(a, b);
if (c[0] == 'H'){
if (s[p - 1] == 'H') k1 = 1;
if (a == b && s[a - 1] == 'H') k2 = H[a];
if (H[a] + H[b] - k1 - k2 - 2 * H[fa[p][0]] == 0) cout << 0;
else cout << 1;
}else{
if (s[p - 1] == 'S') k1 = 1;
if (a == b && s[a - 1] == 'H') k2 = G[a];
if (G[a] + G[b] - k1 - k2 - 2 * G[fa[p][0]] == 0) cout << 0;
else cout << 1;
}
}
return 0;
}