4567: [Scoi2016]背单词

Time Limit: 10 Sec Memory Limit: 256 MB

Submit: 304 Solved: 114

[Submit][Status][Discuss]

Description

Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”。这时候睿智
的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的:
—————
序号 单词
—————
1
2
……
n-2
n-1
n
—————
然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n 个,现在我们从上往下完成计划表,对于一个序号为 x
的单词(序号 1…x-1 都已经被填入):
1) 如果存在一个单词是它的后缀,并且当前没有被填入表内,那他需要吃 n×n 颗泡椒才能学会;
2) 当它的所有后缀都被填入表内的情况下,如果在 1…x-1 的位置上的单词都不是它的后缀,那么你吃 x 颗泡
椒就能记住它;
3) 当它的所有后缀都被填入表内的情况下,如果 1…x-1的位置上存在是它后缀的单词,所有是它后缀的单词中
,序号最大为 y ,那么你只要吃 x-y 颗泡椒就能把它记住。
Lweb 是一个吃到辣辣的东西会暴走的奇怪小朋友,所以请你帮助 Lweb ,寻找一种最优的填写单词方案,使得他
记住这 n 个单词的情况下,吃最少的泡椒。

Input

输入一个整数 n ,表示 Lweb 要学习的单词数。接下来 n 行,每行有一个单词(由小写字母构成,且保证任意单
词两两互不相同)1≤n≤100000, 所有字符的长度总和 1≤|len|≤510000

Output

Lweb 吃的最少泡椒数

Sample Input

2
a
ba

Sample Output

2

题解

这道题我最开始做时竟然考虑了条件一。显然条件一是最不优的,我们根本不用考虑它,所以单词如果有后缀先把后缀填入表格中。
我们将单词倒着插入Tire中,之后根据Tire建树。先填父亲再填儿子这样每个单词的后缀填完了才会被填。之后根据贪心,先填Size小的儿子。因为将Size小的先填可以减少后面儿子的代价,而先填大的会增加代价。根据这个贪心我们就可以算出答案了。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;typedef long long LL;
LL ans;
const int Maxn = 100005, MS = 510005, Size = 26;
int Stack[Maxn], top, Son[MS][Size], totNode;
int to[MS], next[MS], head[MS], totE, totp, Siz[MS];
bool mark[MS];void Adde(int a, int b) {to[++totE] = b; next[totE] = head[a];head[a] = totE;
}void Insert(char *S) {int u = 0; char idx;while (*S) {idx = (*S--) - 'a';if (!Son[u][idx]) Son[u][idx] = ++totNode;u = Son[u][idx];}mark[u] = true;
}void Make_Tree(int u, int cur) {if (mark[cur]) Adde(u, ++totp), Siz[u = totp] = 1;for (int i = 0; i < Size; ++i)if (Son[cur][i]) Make_Tree(u, Son[cur][i]);
}void Get_Siz(int u) {for (int i = head[u]; i; i = next[i])Get_Siz(to[i]), Siz[u] += Siz[to[i]];
}int id;bool cmp(const int &a, const int &b) {return Siz[a] < Siz[b];
}void Cal(int u, int fa) {++id; ans += id - fa; fa = id;int l = top + 1, r = top;for (int i = head[u]; i; i = next[i])Stack[++r] = to[i];sort(Stack + l, Stack + r + 1, cmp);top = r;for (int i = l; i <= r; ++i)Cal(Stack[i], fa);top = l - 1;
}char tmpS[MS];int main() {int n, len; scanf("%d", &n);while (n--) {scanf("%s", tmpS + 1); len = strlen(tmpS + 1);Insert(tmpS + len);} Make_Tree(0, 0); Get_Siz(0); Cal(0, 1);//printf("%d\n", totp);printf("%lld\n", ans);return 0;
}

BZOJ4567[Scoi2016]背单词相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 微信背单词类小程序,小鸡单词源码下载,打卡微信小程序

    微信背单词类小程序,小鸡单词源码下载,微信小程序开发学习案例,小程序开发教程.一个用来背单词每天打卡的微信小程序,还有词汇测试,包含多种词库后台由腾讯云wafer解决方案. 前段时间开始学做微信小程序 ...

  10. python写背单词软件_python背单词小程序

    import random as t #创建单词序列 words=("easy","difficult","answer","co ...

最新文章

  1. 10年布局,这道题都不懂就别想进阿里
  2. 5.Multil-task lasso(多任务lasso回归分析)
  3. ROS与navigation教程——基本导航调整指南
  4. 推荐系统遇上深度学习(八)--AFM模型理论和实践
  5. ReplacingMergeTree:实现Clickhouse数据更新
  6. 数学计算机电路基础,2019上“计算机电路基础”作业(五大题共16小题).docx
  7. 八大妙招:改善企业网络安全
  8. mysql udf http,mysql下mysql-udf-http效率测试小记
  9. RTCM 协议数据解析
  10. RouterOS 动态IP接入上网设置教程(超详细)
  11. 运放放大倍数计算公式_运算放大器基础知识
  12. MATLAB Codesys,Matlab程序导入Codesys PLC教程
  13. Mr. Tsogt Batbayar 担任BCF理事
  14. Solidworks部分报错及解决方法
  15. css3 实现十字光标和光标外圆圈环绕
  16. Qt在Win下调用系统的软键盘,区分win7\win8\win10
  17. 详解awk(一)awk基础知识、选项、程序段解析与实例
  18. 未来闪影 (FlashForward)第一季全集下载
  19. Linux sort --将文本文件内容加以排序
  20. 东南大学2014计算机考研真题,2014年东南大学计算机专业考研真题

热门文章

  1. Unity Transform 学习
  2. 360商城页面练习(html+css+js)
  3. Git 笔记 - git rebase
  4. 时频分析工具箱典型函数的使用
  5. 2018-03-25-利用动态二进制加密实现新型一句话木马之.NET篇
  6. 139说客这个产品跟传统的微博和SNS产品的区别
  7. PAT 甲级 1015. Reversible Primes
  8. Cocos2d-x 3.x 如何编译成安卓程序
  9. windows下DxDiag查看笔记本电脑主板型号信息
  10. Vue小写金额转大写金额以及watch(监听)的使用