1 条题解

  • 2
    @ 2022-9-5 15:17:48
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    using namespace std;
    #define N 510050
    #define M 100050
    #define ll long long
    ll ans=0;
    char x[N];
    int n,cnt,bo[N],tot=1,trie[5000050][27],fa[N],id[N],son[N],num;
    vector<int>tu[N];
    int read()
    {
        int s=0,p=1;
        char ch=getchar();
        while(ch<'0' || ch>'9')
        {
            if(ch=='-')p=-1;
            ch=getchar();
        }
        while(ch>='0' && ch<='9')
        {
            s=(s<<1)+(s<<3)+(ch^48);
            ch=getchar();
        }
        return s*p;
    }
    int find(int x)
    {
        if(fa[x]==x)return fa[x];
        else return fa[x]=find(fa[x]);
    }
    void insert(char *s,int bh)
    {
        int l=strlen(s);
        int u=1;
        for(int i=l-1;i>=0;i--)
        {
            int c=s[i]-'a';
            if(!trie[u][c])trie[u][c]=++tot;
            u=trie[u][c];
        }
        bo[u]=bh;
    }
    void make(int x)
    {
        for(int i=0;i<26;i++)
        {
            int v=trie[x][i];
            if(v)
            {
                if(!bo[v])
                {
                    fa[v]=find(x);
                }
                else
                {
                    tu[bo[find(x)]].push_back(bo[v]);
                }
                make(v);
            }
        }
    }
    int cmp(int x,int y)
    {
        return son[x]<son[y];
    }
    void sonsum(int x)
    {
        son[x]=1;
        for(vector<int> :: iterator it=tu[x].begin();it!=tu[x].end();it++)
        {
            int v=*it;
            sonsum(v);
            son[x]+=son[v];
        }
        sort(tu[x].begin(),tu[x].end(),cmp);
    }
    void dfs(int x)
    {
        id[x]=num++;
        for(vector<int> :: iterator it=tu[x].begin();it!=tu[x].end();it++)
        {
            int v=*it;
            ans+=num-id[x];
            dfs(v);
        }
    }
    void dfss(int x)
    {
        for(vector<int> :: iterator it=tu[x].begin();it!=tu[x].end();it++)
        {
            int v=*it;
            cout<<v<<endl;
            dfss(v);
        }
    }
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",x);
            insert(x,i);
        }
        for(int i=1;i<=tot;i++)fa[i]=i;
        make(1); sonsum(0);dfs(0);
        printf("%lld",ans);
        return 0;
    }
    
    • 1

    信息

    ID
    211
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者