社区讨论

样例没过但是却A了

P6088 [JSOI2015] 字符串树参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo7hoxrh
此快照首次捕获于
2023/10/27 02:00
2 年前
此快照最后确认于
2023/10/27 02:00
2 年前
查看原帖
rt,代码测试样例却输出2 1 0,交上去却A了。
CPP
#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;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...