http://www.lydsy.com/JudgeOnline/problem.php?id=4567
https://www.luogu.org/problem/show?pid=3294
比较有趣的Trie题目之一(而且还挺新的)
我们可以按照各串的后缀建一棵Trie树,然后dfs序遍历出需要的点并标记(指那些位于各串结尾的节点,这些是有用的)
接着我们来考虑题目中的三种情况:

  1. 如果存在一个单词是它的后缀,并且当前没有被填入表内,那他需要吃 n*n 颗泡椒才能学会;
    –这个因为代价太大,如果有这种情况绝对不是最优,不考虑
  2. 当它的所有后缀都被填入表内的情况下,如果在 1…x-1 的位置上的单词都不是它的后缀,那么你吃 x 颗泡椒就能记住它;
    –这个需要考虑
  3. 当它的所有后缀都被填入表内的情况下,如果 1…x-1的位置上存在是它后缀的单词,所有是它后缀的单词中,序号最大为 y ,那么你只要吃 x-y 颗泡椒就能把它记住。
    –这个需要考虑

因为不考虑1,即每个后缀填完后才能填自己,同时呢填完一个单词的子树的最小代价是固定的(自己yy一下
所以只要合理安排儿子的遍历顺序即可。
这题就转化成了贪心
显然的,我们就应该先遍历子树较小的儿子,这样总代价最小(贪心嘛)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll ans=0;
int s[500010],fa[5000010],a[500010],h[500010],son[500010];
char c[1000001];
bool b[500001]={0};
int n,p[500010][26]={0},np=1;
inline void insert(int x){int now=1,l=strlen(c+1);for(int i=l;i;i--){int t=c[i]-'a';if(!p[now][t])p[now][t]=++np;now=p[now][t];s[now]++;}b[now]=1;
}
inline void dfs(int x){int father=fa[x];if(b[x]){h[x]=a[fa[x]];a[fa[x]]=x;father=x;}for(int i=0;i<26;i++)if(p[x][i]){fa[p[x][i]]=father;dfs(p[x][i]);}
}
inline void getans(int x){int sum=0;for(int i=a[x];i;i=h[i])sum++,son[sum]=s[i];sort(son+1,son+sum+1);s[x]=1;for(int i=1;i<=sum;i++)ans+=s[x],s[x]+=son[i];for(int i=a[x];i;i=h[i])getans(i);
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",c+1);insert(i);}fa[1]=1;dfs(1);getans(1);printf("%lld",ans);return 0;
}

Trie——BZOJ4567/Luogu3294 [Scoi2016]背单词相关推荐

  1. 【bzoj4567】[Scoi2016]背单词 贪心+trie树

    我个傻逼,这么水的题还调了那么久. 把所有的串都反过来,建trie树,很明显,不同子树间是不影响的. 一定是先选择父亲节点再选子节点,同一个节点先选子树大小最小的儿子即可. 一开始想错了,以为可以直接 ...

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

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

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

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

  4. [Scoi2016]背单词[字典树+dfs重构树[类似虚树]]

    解题思路:很明显第一个条件是可以避免的,第二个条件是第三个条件的特殊情况,所以有用的只有第三个条件,现在我们就是想将这些单词重排使得每个单词后缀都在这个单词的前面并且代价最小 我们举个例子: 6 a ...

  5. BNU27935——我爱背单词——————【数组模拟】

    我爱背单词 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name:  ...

  6. B.背单词 。。 KMP。模板题

    大四了,Leyni感觉好惆怅,因为找不到工作,所以最后决定考研了,可是Leyni的英语好差,没办法,先从最基本的背单词开始吧.那么多单词怎么才好背呢,话说考研界盛传利用前缀背单词,貌似好神奇的样子.因 ...

  7. 【青少年编程】黄羽恒:我要背单词

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载&quo ...

  8. 不用“背”单词,一个方法从普通二本到哥伦比亚大学:我是如何做到的?

    "学英语太难.太费劲了."我听过无数人这么说. 然而,我的学员们,却都只用了短短3-6个月时间,就以惊人速度提高了英语: 小磊:勉强踩着2本线上了大学,四级考了3次没过,毕业时却拿 ...

  9. 别光顾着背单词了,每天花18分钟做这件事,英语水平暴增!

    在知乎上看过一个问题:在当今社会,英语还重要吗? 点赞第一的回答是-- 英语可以差,但你的口语一定要好! 你记住了1万个单词.将语法书倒背如流.英语成绩名列前茅.英语证书一大摞. 但你的口语差,看见老 ...

  10. 少壮不努力,老大背单词

    少壮不努力,老大背单词 你必须非常努力,才可以看起来毫不费力 uncouth (adj.) 粗鲁的,不文明的 I am embarrassed by your uncouth manners epit ...

最新文章

  1. 使用python中的Matplotlib绘图示例(续)
  2. 【每日一题】212. 单词搜索 II
  3. html中可以添加几个类,从一个类中向一个HtmlHead对象添加多个元素
  4. QT综合示例:QT串口通信
  5. 印度首富之女大婚,贫穷限制了我的想象……
  6. zeromq php server,zeromq   php 轻量级队列
  7. 设计模式笔记四:建造者模式
  8. GreenDroid 开源UI组件
  9. Axure 8图标样式库
  10. 博士申请 | 美国明尼苏达大学葛畅教授招收隐私数据管理方向全奖博士/硕士/博后/访问学者...
  11. 老农的计算机学习笔记(二)硬件篇
  12. 深入浅出讲解梯度消失和梯度爆炸问题(原因、解决方法)
  13. 计算机绘画小房子教案,中班绘画《房子》教案
  14. HDU 5285:wyh2000 and pupil
  15. 20分钟掌握前端编写 CLI 工具
  16. SQL优化(三):子查询和IN,EXISTS用法和优化方法
  17. 一、什么是ceph以及ceph的应用
  18. win10安装程序无法正常启动
  19. 1.3【展讯平台】Android 驱动(Kernel)、系统(framework) 定制,调试日志
  20. 计算机组成原理实验二:运算器实验

热门文章

  1. 神圣罗马帝国(1157~1806)
  2. Vivado IP核之浮点数加减法 Floating-point
  3. c语言中sub是什么指令,汇编 – SUB指令的目的是什么?
  4. matlab处理采集的声音数据
  5. 通过Python爬虫技术获取小说信息
  6. 通过两个列表构建字典_我在两个月内以99美元的价格构建了一个电子商务网站!
  7. 入坑张银奎老师研发的GDK7
  8. 能源互联网理论与及其实际应用初探
  9. 在vue中使用marked解析MARKDOWN,生成目录,运行代码示例
  10. 用Qt图形视图框架开发拼图游戏