rt,代码测试样例却输出2 1 0
,交上去却A了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,h[N],tot,dep[N],fa[N][26],rt[N];
struct edge{
int to,next;
string s;
}e[N<<1];
inline void add(int x,int y,string s){
e[++tot]={y,h[x],s},h[x]=tot;
}
struct Trie{
struct node{
int ch[26],sum;
}t[N<<5];
int tot,root[N];
#define ch(p,x) (t[p].ch[x])
#define s(p) (t[p].sum)
inline void insert(string s,int q){
int p=root[++root[0]]=++tot,n=s.size();
for(int i=0;i<n;i++){
int c=s[i]-'a';
t[p]=t[q];
s(p)++;
ch(p,c)=++tot;
p=ch(p,c);
q=ch(q,c);
}
}
inline int findprefix(string s,int p){
int n=s.size();
for(int i=0;i<n;i++){
int c=s[i]-'a';
p=ch(p,c);
}
return s(p);
}
void dfs(int x,int f){
rt[x]=root[root[0]];
for(int i=1;i<=20;i++)fa[x][i]=fa[fa[x][i-1]][i-1];
dep[x]=dep[f]+1;
for(int i=h[x];i;i=e[i].next){
int y=e[i].to;
if(y==f)continue;
insert(e[i].s,rt[x]);
fa[y][0]=x;
dfs(y,x);
}
}
inline int LCA(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=20;~i;i--)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
for(int i=20;~i;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
inline int query(int x,int y,string s){
return findprefix(s,rt[x])+findprefix(s,rt[y])-findprefix(s,rt[LCA(x,y)])*2;
}
}t;
int main(){
int n;
cin>>n;
for(int i=1;i<n;i++){
int a,b;
string s;
cin>>a>>b>>s;
add(a,b,s);
add(b,a,s);
}
t.dfs(1,0);
int q;
cin>>q;
while(q--){
int a,b;
string s;
cin>>a>>b>>s;
cout<<t.query(a,b,s)<<'\n';
}
return 0;
}