Trie树求助
查看原帖
Trie树求助
1069533
sto_clx_orz楼主2023/12/5 21:13

RT(Wa 70)

#include<bits/stdc++.h>
#define int long long
using namespace std;

namespace clx
{
    int l[2000001], n, m, z, root, cnt, first[500001];
    vector<int> Map[500001];
    struct ll {
        int v, h;
        void operator=(const ll a) {
            v = a.v;
            h = a.h;
        }
        bool operator<(const ll a) const { return h < a.h; }
    } st[2000001][28], a[2000001];

    void ST() {
        int o1 = log2(4 * n), o2 = log2(2 * n);
        for (int i = 1; i <= 4 * n; i++)
            for (int j = 1; j <= o1; j++) st[i][j] = { 0, INT_MAX };
        for (int i = 1; i <= 2 * n; i++) st[i][0] = a[i];
        for (int j = 1; j <= o2; j++) {
            for (int i = 1; i <= 2 * n; i++) {
                st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
            }
        }
        for (int i = 2; i <= 2 * n; i++) {
            l[i] = l[i / 2] + 1;
        }
    }

    int q(int u, int v) {
        if (u > v)
            swap(u, v);
        int o = l[v - u + 1];
        return min(st[u][o], st[v - (1 << o) + 1][o]).v;
    }

    void A(int u, int f, int h) {
        a[++cnt] = { u, h };
        first[u] = cnt;
        for (auto i : Map[u]) {
            if (i != f) {
                A(i, u, h + 1);
                a[++cnt] = { u, h };
            }
        }
    }

    int lca(int u,int v)
    {
        return q(first[u],first[v]);
    }
}

int m,n,t[1000001][26],s[1000001],root[100001],v[1000001],cnt;
vector<pair<int,string>>Map[100001];

void dfs(int u,int f)
{
    for(auto k:Map[u])
    {
        if(k.first==f)continue;
        root[k.first]=++cnt;
        int now=root[u];
        for(int j=0;j<26;j++)t[cnt][j]=t[now][j];
        now=cnt;
        for(int i=0;i<k.second.size();i++)
        {
            cnt++;
            for(int j=0;j<26;j++)t[cnt][j]=t[t[now][k.second[i]-'a']][j];
			t[now][k.second[i]-'a']=cnt;
            now=cnt;
        }
        s[now]++;
        dfs(k.first,u);
    }
}

int query(int u,string s1)
{
    int now=root[u];
    for(int i=0;i<s1.size();i++)now=t[now][s1[i]-'a'];
    return s[now];
}

void dfstrie(int u)
{
	v[u]=1;
	for(int i=0;i<26;i++)
	{
		if(!v[t[u][i]])dfstrie(t[u][i]);
		s[u]+=s[t[u][i]];
	}
}

signed main()
{
    cin>>n;
    clx::n=n;
    for(int i=1;i<n;i++)
    {
        int u,v;
        string s;
        cin>>u>>v>>s;
        Map[u].push_back({v,s});
        Map[v].push_back({u,s});
        clx::Map[u].push_back(v);
        clx::Map[v].push_back(u);
    }
    clx::A(1,0,0);
    clx::ST();
    root[1]=++cnt;
    dfs(1,0);
    for(int i=1;i<=n;i++)dfstrie(root[i]);
    //for(int i=1;i<=cnt;i++)cout<<s[i]<<'\n';
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        string s;
        cin>>u>>v>>s;
        cout<<query(u,s)+query(v,s)-2*query(clx::lca(u,v),s)<<"\n";
    }
}
2023/12/5 21:13
加载中...