zoukankan      html  css  js  c++  java
  • 【bzoj4567】SCOI2016背单词

    题号莫名喜感。

    倒序建Trie,dfs这棵Trie,贪心一下,每次按照size排序计算贡献就好。

    #include<bits/stdc++.h>
    #define N 100010
    #define M 500010
    using namespace std;
    typedef long long ll;
    ll ans=0;
    int ch[M][26],val[M],tpos[M],cnt,rt,tot,n,size[M];
    char s[M];
    vector<int> a[N];
    inline bool cmp(int x,int y){return size[x]<size[y];}
    inline void ins(char *s){
        int len=strlen(s+1);int now=rt,v;
        for(int i=len;i;i--){
            v=s[i]-'a';
            if(!ch[now][v])ch[now][v]=++tot;
            now=ch[now][v];
        }
        val[now]=1;
    }
    void dfs(int u){
        if(val[u]){a[tpos[u]].push_back(++cnt);tpos[u]=cnt;}
        for(int i=0;i<26;i++){
            if(ch[u][i]){
                tpos[ch[u][i]]=tpos[u];
                dfs(ch[u][i]);
            }
        }
    }
    void dfs2(int u){
        size[u]=1;int v;
        for(int i=0;i<a[u].size();i++){v=a[u][i];dfs2(v);size[u]+=size[v];}
    }
    void dfs3(int u){
        tpos[u]=++cnt;
        sort(a[u].begin(),a[u].end(),cmp);
        for(int i=0;i<a[u].size();i++){
            ans+=cnt+1-tpos[u];
            dfs3(a[u][i]);
        }
    }
    int main(){
        rt=tot=1;scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",s+1);ins(s);
        }
        tpos[rt]=cnt=1;
        dfs(rt);dfs2(1);cnt=0;dfs3(1);
        cout<<ans<<endl;
    }
  • 相关阅读:
    软工个人项目
    软工第一次个人博客作业
    软工第一次热身作业
    OO第四单元作业总结
    OO第三单元作业总结
    2019-oo-第二次总结
    提问回顾与个人总结
    Github Actions 实践
    北航软工结对项目
    北航个人博客作业-软件案例分析
  • 原文地址:https://www.cnblogs.com/zcysky/p/7039225.html
Copyright © 2011-2022 走看看