显示原始代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 5;
int n, q;
struct Nod {
int to, nex;
char val;
} edge[MAXN << 1];
int cnt, head[MAXN], u, v, lg[MAXN];
char w, val[MAXN];
string str;
void add(int u, int v, char w) {
edge[++cnt].to = v;
edge[cnt].val = w;
edge[cnt].nex = head[u];
head[u] = cnt;
}
void merage(int u, int v, char w) {
add(u, v, w);
add(v, u, w);
}
int st[30][MAXN], dep[MAXN];
void dfs(int f, int x) {
dep[x] = dep[f] + 1;
st[0][x] = f;
for (int i = head[x]; i; i = edge[i].nex) {
int v = edge[i].to;
if (f == v)
continue;
val[v] = edge[i].val;
dfs(x, v);
}
}
void init() {
for (int k = 1; k < 30; ++k)
for (int i = 1; i <= n; ++i) st[k][i] = st[k - 1][st[k - 1][i]];
for (int i = 1; i < MAXN; ++i) lg[i] = lg[i - 1] + ((1 << (lg[i - 1] + 1)) == i);
}
int LCA(int x, int y) {
if (x == y)
return x;
if (dep[x] < dep[y])
swap(x, y);
while (dep[x] > dep[y]) x = st[lg[dep[x] - dep[y]]][x];
if (x == y)
return x;
for (int i = lg[dep[x]]; i >= 0; --i)
if (st[i][x] != st[i][y]) {
x = st[i][x];
y = st[i][y];
}
return st[0][x];
}
string dis(int x, int y) {
string temp = "";
while (dep[x] > dep[y]) {
temp = temp + val[x];
x = st[0][x];
}
return temp;
}
string cov(string temp) {
for (int i = 0; i < temp.size() / 2; ++i) {
swap(temp[i], temp[temp.size() - i - 1]);
}
return temp;
}
string create(int x, int y) {
string temp = "";
int lca = LCA(x, y);
temp = temp + dis(x, lca) + cov(dis(y, lca));
return temp;
}
string sub(string o, int i, int len) {
string temp = "";
while (len) {
temp = temp + o[i++];
len--;
}
return temp;
}
int ans(string t, string str) {
int temp = 0, len = str.size();
for (int i = 0; i <= t.size() - str.size(); ++i)
if (str == sub(t, i, len))
temp++;
return temp;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> q;
for (int i = 1; i < n; ++i) {
cin >> u >> v >> w;
merage(u, v, w);
}
dfs(0, 1);
init();
for (int i = 1; i <= q; ++i) {
cin >> u >> v >> str;
cout << ans(create(u, v), str) << endl;
}
return 0;
}