样例没过但是却A了
查看原帖
样例没过但是却A了
665366
bbjr楼主2022/11/22 06:45

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;
}
2022/11/22 06:45
加载中...