码迷,mamicode.com
首页 > 其他好文 > 详细

cf965e Short Code

时间:2018-05-01 23:33:54      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:size   htm   cin   dfs   cto   push   clear   source   stream   

ref

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
int n, tot, dfn[100005], s[100005][26], dep[100005], idx, siz[100005], ans;
bool iss[100005];
char ss[100005];
vector<int> vec[100005];
void insert(){
    int u=0;
    int len=strlen(ss);
    for(int i=0; i<len; i++){
        int t=ss[i]-‘a‘;
        if(!s[u][t])    s[u][t] = ++tot;
        u = s[u][t];
    }
    iss[u] = true;
}
void dfs(int x, int d){
    dep[x] = d;
    dfn[x] = ++idx;
    siz[x] = 1;
    for(int i=0; i<26; i++)
        if(s[x][i]){
            dfs(s[x][i], d+1);
            siz[x] += siz[s[x][i]];
        }
}
void faq(int x){
    for(int i=0; i<26; i++)
        if(s[x][i]){
            faq(s[x][i]);
            if(vec[x].size()<vec[s[x][i]].size())   swap(vec[x], vec[s[x][i]]);
            for(int j=0; j<vec[s[x][i]].size(); j++){
                vec[x].push_back(vec[s[x][i]][j]);
                push_heap(vec[x].begin(), vec[x].end());
            }
            vec[s[x][i]].clear();
        }
    if(!iss[x] && x && vec[x].size()){
        pop_heap(vec[x].begin(), vec[x].end());
        vec[x].pop_back();
        vec[x].push_back(dep[x]);
        push_heap(vec[x].begin(), vec[x].end());
    }   
    if(iss[x]){
        vec[x].push_back(dep[x]);
        push_heap(vec[x].begin(), vec[x].end());
    }
}
int main(){
    cin>>n;
    for(int i=1; i<=n; i++){
        scanf("%s", ss);
        insert();
    }
    dfs(0, 0);
    faq(0);
    for(int i=0; i<vec[0].size(); i++)
        ans += vec[0][i];
    cout<<ans<<endl;
    return 0;
}

cf965e Short Code

标签:size   htm   cin   dfs   cto   push   clear   source   stream   

原文地址:https://www.cnblogs.com/poorpool/p/8977367.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!