已经改的和题解里的几乎一样了,还是过不了,调了半个小时了不知道哪里错了。
#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, m;
int f[100005][17], g[100005], h[100005], dep[100005];
char s[100005];
vector <int> G[100005];
void dfs (int u, int fa) {
for (int v : G[u]) {
if (v == fa) return;
f[v][0] = u;
h[v] += h[u];
g[v] += g[u];
dep[v] = dep[u] + 1;
dfs (v, u);
}
}
int lca (int u, int v) {
if (dep[u] < dep[v]) swap (u, v);
foR (i, 16, 0) if (dep[f[u][i] ] >= dep[v]) u = f[u][i];
if (u == v) return u;
foR (i, 16, 0) if (f[u][i] != f[v][i]) {
u = f[u][i];
v = f[v][i];
}
return f[u][0];
}
void solve () {
dep[1] = 1;
cin >> n >> m >> s + 1;
For (i, 1, n) {
if (s[i] == 'H') h[i] = 1;
else g[i] = 1;
}
For (i, 2, n) {
int u, v;
cin >> u >> v;
G[u].push_back (v);
G[v].push_back (u);
}
dfs (1, 0);
For (i, 1, 16) For (j, 1, n) f[j][i] = f[f[j][i - 1] ][i - 1];
For (i, 1, m) {
int u, v;
char c;
cin >> u >> v >> c;
int l = lca (u, v);
if (c == 'H') {
if ( (h[u] + h[v] - h[l] - h[f[l][0] ]) > 0) cout << 1;
else cout << 0;
} else {
if ( (g[u] + g[v] - g[l] - g[f[l][0] ]) > 0) cout << 1;
else cout << 0;
}
}
}
signed main () {
int _ = 1;
// cin >> _;
while (_ --) {
solve ();
cout << '\n';
}
return 0;
}