题意:重新解释一下题意吧(题意晦涩难懂)

给定n个单词,你可以按照顺序学习,当学习这一单词时,这个单词是第x个要学习的单词,需要的代价分三类:

1、若存在其他单词是其后缀没被学习,则代价为n2

2、若不存在其他单词是其后缀,则代价是x

3、否则代价是x-y(y是最靠后的是其后缀的单词学习的位置)

题解:

首先第一种情况要是存在显然不是最优的,然后很容易联想到建立字符串的反串。为了使答案尽可能小,一定存在一种方案为树上的dfs序,容易证明这样一定比不是dfs序更优。然后取出关键点,按照子树大小从小到大排列一下就完了,为什么从小到大排序,因为排队接水问题大家应该是知道的。

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+;
int n,tot,ch[N][],val[N],sz[N],dfn[N];
long long ans;
char str[N];
vector<int>G[N];
void build()
{
int len=strlen(str),u=,c;
for(int i=len-;~i;i--)
{
c=str[i]-'a';
if(!ch[u][c])ch[u][c]=++tot;
u=ch[u][c];
}
val[u]=;
}
void dfs1(int u,int fa)
{
if(val[u])G[fa].push_back(u);
for(int i=;i<;i++)if(ch[u][i])dfs1(ch[u][i],val[u]?u:fa);
}
bool cmp(int a,int b){return sz[a]<sz[b];}
void dfs2(int u,int fa)
{
dfn[u]=++tot;
if(u!=)ans+=dfn[u]-dfn[fa];
sort(G[u].begin(),G[u].end(),cmp);
for(int i=;i<G[u].size();i++)dfs2(G[u][i],u);
}
int main()
{
scanf("%d",&n),tot=;
for(int i=;i<=n;i++)scanf("%s",str),build();
dfs1(,);
for(int i=tot;i;i--)
if(val[i])
{
sz[i]=;
for(int j=;j<G[i].size();j++)sz[i]+=sz[G[i][j]];
}
tot=;
dfs2(,);
printf("%lld",ans);
}

[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. [SCOI2016]背单词——trie树相关

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

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

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

  6. BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...

  7. [luogu] P3294 [SCOI2016]背单词 (贪心)

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

  8. P3294 [SCOI2016]背单词

    P3294 [SCOI2016]背单词 Trie+贪心 倒插进树+取出重建+子树处理+贪心遍历 倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中 取出重建:重新建立一棵以单词为节点的树,如果 ...

  9. 4567: [Scoi2016]背单词

    4567: [Scoi2016]背单词 https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题意: 题意看了好久,最后在其他人的博客里看懂了的. ...

  10. 【bzoj4567】[Scoi2016]背单词

    4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][ ...

随机推荐

  1. Linux用户管理 权限管理 内存管理 网络管理命令 (第四天)

    默认添加的用户会自动加入和用户名一样的组中su 切换用户查看当前登陆的用户: whoami id`查看当前用户属于哪个组:groupsgroupadd 组名 添加组groupdel 组名 删除组gre ...

  2. CTF-域渗透--靶场夺旗

    开门见山 1. 扫描靶场ip 192.168.1.106 2. 扫描靶场开放端口 3. 扫描靶场全部信息 4. 探测靶场敏感信息 5. 对一些特殊的端口进行nc探测 6. 为了绕过对应命令执行限制,可 ...

  3. CLR .net windows对win32 core抽象的新用处

    断断续续 花了一周的时间,把.net clr的一些知识看完了(确切的说是 一个段落),总体的感觉就是,ms把win32 core创建进程线程.虚拟地址.内存隔离的思想又重用了一遍,有所不同的是这次的场 ...

  4. SQL SERVER 2012 OBJECT_ID

    原来一个存储过程执行正常,升级sqlserver后提示临时表已存在,后查找资料 sql server 2012  OBJECT_ID('临时表')返回的数值是负数,在 2008r2及前是正数,所以导致 ...

  5. C++ 模板练习1

    //特定的模板友元关系 #include "stdafx.h" #include <iostream> using namespace std; template< ...

  6. python全局变量、回调函数

    1.python全局变量相关概念及使用 来自菜鸟教程上的例子: http://www.runoob.com/python3/python3-function.html 一.python入参需要注意地方 ...

  7. python中的with用法

    with是从Python2.5引入的一个新的语法,它是一种上下文管理协议,目的在于从流程图中把 try,except 和finally 关键字和 资源分配释放相关代码统统去掉,简化try….excep ...

  8. find_element_by_xpath()的6种方法

    Xpath (XML Path Language),是W3C定义的用来在XML文档中选择节点的语言 一:从根目录/开始 有点像Linux的文件查看,/代表根目录,一级一级的查找,直接子节点,相当于cs ...

  9. Lock wait timeout exceeded; try restarting transaction(mysql事务锁)

    现场环境客户要求删数据(界面没法直接操作),于是直接在数据库进行查询删除了,删完发现界面依然能查到删除后的数据,又用sql语句进行删除,发现报了错:Lock wait timeout exceeded ...

  10. P3241 [HNOI2015]开店

    题解:动态点分治 建立点分树 每个点维护点分树子树内节点到这个节点和父亲节点距离的前缀和 二分查找锁定合法区间 对每个祖先分治中心查询路径和然后减去不合法子树内的路径和 注意:求大量LCA时用树剖 不 ...