zoukankan      html  css  js  c++  java
  • [SCOI2016] 背单词 (Trie树)

     $pdfspace solution$      link  

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #define ll long long
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    const int MAXN=510001;
    vector<int> ve[MAXN];
    struct node{
        int u,v,nex;
    }x[MAXN<<2];
    int head[MAXN],cnt;
    void add(int u,int v){
        x[cnt].u=u,x[cnt].v=v,x[cnt].nex=head[u],head[u]=cnt++;
    }
    int ch[MAXN][28],bo[MAXN],siz[MAXN],tot=1;
    struct Trie{
        void init(){memset(ch,-1,sizeof(ch));}
        void insert(char *s){
            int len=strlen(s);
            int u=1;
            for(int i=len-1;i>=0;i--){
                int c=s[i]-'a';
                if(ch[u][c]==-1) {
                    ch[u][c]=++tot;
                    add(u,ch[u][c]);
                }
                u=ch[u][c];
            }
            bo[u]++;
            return;
        }
    }trie;
    void build(int u,int spe){
        if(bo[u]) ve[spe].push_back(u),spe=u;
        for(int i=head[u];i!=-1;i=x[i].nex) build(x[i].v,spe);
    }
    int n;
    void init_siz(int u){
        siz[u]=1;
        int Siz=ve[u].size();
        for(int i=0;i<Siz;i++){
            init_siz(ve[u][i]);
            siz[u]+=siz[ve[u][i]];
        }return;
    }ll Tot,ans;
    bool cmp(int xx,int yy){
        return siz[xx]<siz[yy];
    }
    void query(int u,int time){
    //    printf("u:%d time:%d
    ",u,time);
        int p=++Tot;
        ans+=(ll)p-time;
        sort(ve[u].begin(),ve[u].end(),cmp);
        int siz=ve[u].size();
        for(int i=0;i<siz;i++) query(ve[u][i],p);
        return;
    }
    char str[MAXN],str1[MAXN];
    signed main(){
    //    freopen("word.in","r",stdin);
        memset(head,-1,sizeof(head));
        trie.init();
        n=read();
        for(int i=1;i<=n;i++){
            scanf("%s",str);
            trie.insert(str);
        }
        build(1,1);
        init_siz(1);
        query(1,1);
        printf("%lld
    ",ans);
    }/*
    2
    aa
    aaa
    */
    View Code
  • 相关阅读:
    让元素水平和垂直居中的方法总结
    a标签常见问题
    centos7的安装
    java面向对象-类的定义
    java内存划分
    java基础知识点-数组
    java基础知识点-重载
    第一章:服务器的组成知识点
    java 第二天运算符及录入函数Scanner
    java第一天 数据类型、变量的命名、类型的转换
  • 原文地址:https://www.cnblogs.com/si-rui-yang/p/10538735.html
Copyright © 2011-2022 走看看