传送门

题意:

给你n个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串s的位置为x):

1.排在s后面的字符串有s的后缀,则代价为n^2;

2.排在s前面的字符串有s的后缀,且没有排在s后面的s的后缀,则代价为x-y(y为最后一个与s不相等的后缀的位置);

3.s没有后缀,则代价为x。

求最小代价和。


思路:显然把所有字符串倒序建一个trietrietrie树出来。

然后在上面贪心每次走sizesizesize最小的子树最优。

代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
const int N=1e5+5,M=510005;
typedef long long ll;
typedef pair<int,int> pii;
char s[N];
int n;
ll ans=0;
namespace Trie{
    int son[M][26],siz[M],tot=1,rt=1,num[M],cnt=-1;
    bool ed[M];
    set<pii>e[M];
    inline void insert(char s[]){
        int p=rt;
        for(ri i=strlen(s)-1;~i;--i){
            if(!son[p][s[i]-'a'])son[p][s[i]-'a']=++tot;
            p=son[p][s[i]-'a'];
            ++siz[p];
        }
        ed[p]=1;
    }
    void build(int p=rt,int pre=rt){
        if(ed[p])e[pre].insert(pii(siz[p],p));
        for(ri i=0;i<26;++i)if(son[p][i])build(son[p][i],ed[p]?p:pre);
    }
    void dfs(int p=rt){
        num[p]=++cnt;
        for(set<pii>::iterator it=e[p].begin();it!=e[p].end();++it)dfs(it->se),ans+=num[it->se]-num[p];
    }
}
int main(){
    scanf("%d",&n);
    for(ri i=1;i<=n;++i)scanf("%s",s),Trie::insert(s);
    Trie::build();
    Trie::dfs();
    cout<<ans;
    return 0;
}

2019.03.25 bzoj4567: [Scoi2016]背单词(trie+贪心)的更多相关文章

  1. [BZOJ4567][SCOI2016]背单词(Trie+贪心)

    1.题意表述十分难以理解,简单说就是:有n个单词,确定一个背的顺序,使总代价最小. 2.因为第(1)种情况的代价是n*n,这个代价比任何一种不出现第(1)种情况的方案都要大,所以最后肯定不会出现“背某 ...

  2. [bzoj4567][Scoi2016]背单词-Trie+贪心+模型转化

    Brief Description 给你N个互不相同的字符串,记\(S_i\)为第i个字符串,现在要求你指定N个串的出现顺序,我们用\(V_i\)表示第i个字符串是第几个出现的,则V为1到N的一个排列 ...

  3. 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心

    [BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...

  4. BZOJ4567[Scoi2016]背单词

    4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...

  5. [SCOI2016]背单词——trie树相关

    题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...

  6. BZOJ4567 SCOI2016背单词(trie+贪心)

    倒过来变成查询前缀.考虑怎么排序.第一条代价n*n就相当于inf,说明一个单词的所有前缀都要排在它前面.那么串的依赖关系就是trie的结构.二三条说明代价是Σidi-idfa,那么显然最后的编号应该是 ...

  7. BZOJ4567 [Scoi2016]背单词 【trie树 + 贪心】

    题目链接 BZOJ4567 题解 题意真是鬼畜= = 意思就是说我们应先将一个串的所有后缀都插入之后再插入这个串,产生代价为其到上一个后缀的距离 我们翻转一下串,转化为前缀,就可以建\(trie\)树 ...

  8. [bzoj4567][Scoi2016][背单词] (贪心+trie树)

    Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...

  9. [SCOI2016] 背单词 (Trie 树,贪心)

    题目链接 大致题意 给你 \(n\) 个字符串, 要求你给出最小的代价. 对于每个字符串: 1.如果它的后缀在它之后,那么代价为 \(n^2\). 2.如果一个字符串没有后缀,那么代价为 \(x\), ...

随机推荐

  1. vue 动态添加 <style> 样式 vue动态添加 绑定自定义字体样式

    created(){ //动态添加自定义字体样式 let style = document.createElement('style'); style.type = "text/css&qu ...

  2. jQuery横向上下排列鱼骨图形式信息展示代码时光轴样式(转自CSDN,原文链接附于文中)

    原文链接:http://www.jqueryfuns.com/resource/2173 $.fn.fishBone = function(data) { var colors = ['#F89782 ...

  3. Echars 地图属性详解

    1.引入echarts库文件 <script charset="utf-8" type="text/javascript" language=" ...

  4. gradle 排除jar包依赖

    1.直接在configuration中排除 configurations { compile.exclude module: 'commons' all*.exclude group: 'org.gr ...

  5. Java框架spring 学习笔记(二):Bean的作用域

    Spring 框架Bean支持以下五个作用域: 下面介绍两种作用域,singleton和protoype singleton作用域 singleton作用域为默认作用域,在同一个ioc容器内getBe ...

  6. 阅读:JAVA 3& 4

    随机数: Random rand = new Random(47); // 产生随机算子.47 is seed. for incovating predicatable random numberin ...

  7. hystrix参数详解

    hystrix.command.default和hystrix.threadpool.default中的default为默认CommandKey Execution相关的属性的配置: hystrix. ...

  8. angular 遍历foreach

    1.angular遍历angular.forEach(groups,function (group) { })

  9. c# post方法亲测可用

    /// <summary> /// Post接口方法 /// </summary> /// <param name="requestUri">& ...

  10. Kafka 性能测试报告

    Producer command: kafka-producer-perf-test --topic _perf-test --num-records 10000000 --record-size 1 ...