#include<bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const int maxn = 20005;
struct node {
int v;
char w;
};
vector<node> G[maxn];
unordered_map<unsigned long long, int> mp[maxn];
int ans[maxn];
int n, q, u, v, st, val[maxn];
char w;
void dfs(unsigned long long e, int x, int fa) {
mp[x][e] = val[x];
if (G[x].size() == 1 && G[x][0].v == fa) {
return;
}
for (int i = 0; i < G[x].size(); ++i) {
if (G[x][i].v == fa) {
continue;
}
dfs(e * 131 + (G[x][i].w - 'a' + 1), G[x][i].v, x);
for (auto &k:mp[G[x][i].v]) {
mp[x][k.first] += k.second;
}
}
for (auto &i:mp[x]) {
ans[x] = max(ans[x], i.second);
}
mp[x].clear();
}
int main() {
ios::sync_with_stdio(0);
cin >> n >> q;
for (int i = 1; i <= n; ++i) {
cin >> val[i];
}
for (int i = 1; i < n; ++i) {
cin >> u >> v >> w;
G[u].push_back({v, w});
G[v].push_back({u, w});
}
dfs(0, 1, 1);
while (q--) {
cin >> st;
cout << ans[st] << '\n';
}
return 0;
}
bytecamp
最新推荐文章于 2022-07-02 21:41:49 发布