1.题意表述十分难以理解,简单说就是:有n个单词,确定一个背的顺序,使总代价最小。

2.因为第(1)种情况的代价是n*n,这个代价比任何一种不出现第(1)种情况的方案都要大,所以最后肯定不会出现“背某个单词的时候它的后缀还没背”的情况。

3.考虑将每个串和单词表中它的最长后缀连边,则形成了一棵树。我们需要给树上每个点分配一个1~n的整数v[]且两两不同(就是背的顺序,要保证儿子分配到的数一定大于父亲)。那么总代价就是所有点的v[i]-v[fa[i]]。可以发现,要让总代价最小,最终的涂色序列(就是背的顺序)是这棵树的一个DFS序。

4.关于建树,将所有串翻转变成前缀问题,再对所有串建Trie即可。

5.考虑哪个DFS序能让总代价最小,考虑一个点的所有儿子,当走入一个儿子时,其它儿子和父亲的差就会+1,其余点不变。那么要让答案最小就必须要尽快从那个儿子中出来,于是肯定是选择size最小的那个儿子。

这个结论全网都说十分显然但我既想不到也不会证,感觉自己贪心水平十分低下。

 #include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
typedef long long ll;
using namespace std; const int N=;
int n,tim,nd=,cnt,tot,top,h[N],to[N],nxt[N<<];
int id[N],fa[N],ch[N][],stk[N],a[N],sz[N],v[N];
ll ans;
char s[N];
vector<int>ve[N]; void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; }
bool cmp(int a,int b){ return sz[a]<sz[b]; } void ins(int k,char s[]){
int x=,len=strlen(s+);
for (int i=len; i; i--){
if (!ch[x][s[i]-'a']) ch[x][s[i]-'a']=++nd;
x=ch[x][s[i]-'a'];
}
v[x]=k;
} void dfs1(int x){
if (v[x]) fa[v[x]]=stk[top],add(stk[top],v[x]),stk[++top]=v[x];
rep(i,,) if (ch[x][i]) dfs1(ch[x][i]);
if (v[x]) top--;
} void dfs2(int x){ sz[x]=; For(i,x) if ((k=to[i])!=fa[x]) dfs2(k),sz[x]+=sz[k]; } void dfs3(int x){
tot=; id[x]=++tim;
For(i,x) if ((k=to[i])!=fa[x]) ve[x].push_back(k);
sort(ve[x].begin(),ve[x].end(),cmp); int ed=ve[x].size()-;
rep(i,,ed) dfs3(ve[x][i]);
} int main(){
freopen("bzoj4567.in","r",stdin);
freopen("bzoj4567.out","w",stdout);
scanf("%d",&n);
rep(i,,n) scanf("%s",s+),ins(i,s);
dfs1(); dfs2(); dfs3();
rep(i,,n) ans+=id[i]-id[fa[i]];
printf("%lld\n",ans);
return ;
}

[BZOJ4567][SCOI2016]背单词(Trie+贪心)的更多相关文章

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

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

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

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

  3. BZOJ4567[Scoi2016]背单词

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

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

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

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

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

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

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

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

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

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

    传送门 题意: 给你n个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串s的位置为x): 1.排在s后面的字符串有s的后缀,则代价为n^2: 2.排在s前面的字符串有s的后缀,且没有排在s ...

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

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

随机推荐

  1. 【译】第十四篇 Integration Services:项目转换

    本篇文章是Integration Services系列的第十四篇,详细内容请参考原文. 简介在前一篇,我们查看了SSIS变量,变量配置和表达式管理动态值.在这一篇,我们使用SQL Server数据商业 ...

  2. Ping程序的实现

    Ping程序的实现 在windows系统下进行cmd可以进行ping操作. ping命令是用来确定本地主机与网络中其他主机的网络通信情况,或者查看是否是为效IP. ping的工作原理:网络另一主机发送 ...

  3. ActiveMQ监听消息并进行转发,监听不同的mq服务器和不同的队列

    工作中刚接触mq消息业务,其实也就是监听一下别的项目发送的消息然后进行对应的转发,但是监听的mq会有多个,而且转发的地址也可能有多个,这里就使用spring集成的方式!记录一下实现方式: 监听多个mq ...

  4. 2017-2018-2 20179205《网络攻防技术与实践》第十一周作业 SQL注入攻击与实践

    <网络攻防技术与实践>第十一周作业 SQL注入攻击与实践 1.研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 缓冲区溢出原理   在计算机内部,输入数据通常被存放在一个临时空间内, ...

  5. thinkphp报错Call to undefined method app\index\controller\Index::fetch()

    因为要写一个系统,所以又重新下载了thinkphp,然后安装了一下.回忆起这个问题很容易让新手朋友费解.会出现如下报错:Call to undefined method app\index\contr ...

  6. Once you eliminate all the other factors,the only thing remaining must be the truth.

    Once you eliminate all the other factors,the only thing remaining must be the truth. 一旦你排除了杂因,剩下的一定是 ...

  7. linux调试工具glibc的演示分析

    偶然中发现,下面的两端代码表现不一样 void main(){ void* p1 = malloc(32);       free(p1); free(p1); // 这里会报double free ...

  8. 非极大值抑制(NMS,Non-Maximum Suppression)的原理与代码详解

    1.NMS的原理 NMS(Non-Maximum Suppression)算法本质是搜索局部极大值,抑制非极大值元素.NMS就是需要根据score矩阵和region的坐标信息,从中找到置信度比较高的b ...

  9. 工作常用shell集合

    <1>日志回滚案例======>[root@localhost test]# cat hbase.sh hbase_rotate_log ()       {    log=$1;  ...

  10. 18 A GIF decoder: an exercise in Go interfaces 一个GIF解码器:go语言接口训练

    A GIF decoder: an exercise in Go interfaces  一个GIF解码器:go语言接口训练 25 May 2011 Introduction At the Googl ...