BZOJ4567 SCOI2016背单词(trie+贪心)
倒过来变成查询前缀。考虑怎么排序。第一条代价n*n就相当于inf,说明一个单词的所有前缀都要排在它前面。那么串的依赖关系就是trie的结构。二三条说明代价是Σidi-idfa,那么显然最后的编号应该是trie的一个dfs序(去掉无用节点),并且显然应该先走较小的子树,因为这样使兄弟节点和父亲的编号差更小而不造成其他影响。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<vector> using namespace std; #define ll long long #define N 510010 #define M 100010 int read() {int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f; } char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')) c=getchar();return c;} int gcd(int n,int m){return m==0?n:gcd(m,n%m);} int n,trie[N][26],val[N],cnt; int size[M],id[M]; ll ans; vector<int> s[M],son[M]; bool cmp(const int&a,const int&b) {return size[a]<size[b]; } void ins(vector<int> s,int i) {int k=0;for (int j=0;j<s.size();j++){if (!trie[k][s[j]]) trie[k][s[j]]=++cnt;k=trie[k][s[j]];}val[k]=1; } void build(int k,int from) {if (val[k]) cnt++,son[from].push_back(cnt),from=cnt;for (int i=0;i<26;i++)if (trie[k][i]) build(trie[k][i],from); } void dfs(int k) {size[k]=1;for (int i=0;i<son[k].size();i++){dfs(son[k][i]);size[k]+=size[son[k][i]];}sort(son[k].begin(),son[k].end(),cmp); } void calc(int k,int from) {id[k]=++cnt;ans+=id[k]-id[from];for (int i=0;i<son[k].size();i++)calc(son[k][i],k); } int main() { #ifndef ONLINE_JUDGEfreopen("bzoj4567.in","r",stdin);freopen("bzoj4567.out","w",stdout);const char LL[]="%I64d\n"; #elseconst char LL[]="%lld\n"; #endifn=read();for (int i=1;i<=n;i++){s[i].push_back(getc()-'a');char c=getchar();while (c>='a'&&c<='z') s[i].push_back(c-'a'),c=getchar();reverse(s[i].begin(),s[i].end());ins(s[i],i);}cnt=0;build(0,0);dfs(0);cnt=-1;calc(0,0);cout<<ans;return 0; }
转载于:https://www.cnblogs.com/Gloid/p/9890265.html
BZOJ4567 SCOI2016背单词(trie+贪心)相关推荐
- BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...
- 【bzoj4567】[Scoi2016]背单词 贪心+trie树
我个傻逼,这么水的题还调了那么久. 把所有的串都反过来,建trie树,很明显,不同子树间是不影响的. 一定是先选择父亲节点再选子节点,同一个节点先选子树大小最小的儿子即可. 一开始想错了,以为可以直接 ...
- [Scoi2016]背单词[字典树+dfs重构树[类似虚树]]
解题思路:很明显第一个条件是可以避免的,第二个条件是第三个条件的特殊情况,所以有用的只有第三个条件,现在我们就是想将这些单词重排使得每个单词后缀都在这个单词的前面并且代价最小 我们举个例子: 6 a ...
- 牌组资源英语_「桌游推荐」如果当年有这种能背单词的桌游,我早就成英语学霸了...
英语课上的背单词,像语文课上的背诵全文一样,是学生时代不少英语"学渣"们的噩梦,甚至现在很多人拿起英语词典还是从"abandon"开始痛苦的背单词之旅. 其实英 ...
- BNU27935——我爱背单词——————【数组模拟】
我爱背单词 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: ...
- B.背单词 。。 KMP。模板题
大四了,Leyni感觉好惆怅,因为找不到工作,所以最后决定考研了,可是Leyni的英语好差,没办法,先从最基本的背单词开始吧.那么多单词怎么才好背呢,话说考研界盛传利用前缀背单词,貌似好神奇的样子.因 ...
- 【青少年编程】黄羽恒:我要背单词
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载&quo ...
- 不用“背”单词,一个方法从普通二本到哥伦比亚大学:我是如何做到的?
"学英语太难.太费劲了."我听过无数人这么说. 然而,我的学员们,却都只用了短短3-6个月时间,就以惊人速度提高了英语: 小磊:勉强踩着2本线上了大学,四级考了3次没过,毕业时却拿 ...
- 别光顾着背单词了,每天花18分钟做这件事,英语水平暴增!
在知乎上看过一个问题:在当今社会,英语还重要吗? 点赞第一的回答是-- 英语可以差,但你的口语一定要好! 你记住了1万个单词.将语法书倒背如流.英语成绩名列前茅.英语证书一大摞. 但你的口语差,看见老 ...
最新文章
- eclipse目录出现重复情况 解决
- word_cloud
- mysql查询后从高到低排序_[MySQL基础]三、排序查询
- Docker启动容器时出现错误
- 自制口袋妖怪_承诺和口袋妖怪-我如何学会异步思考
- Mac latex vscode配置外部PDF阅读器并配置对应跳转
- 苹果发布iOS 15.3正式版 修复了Safari浏览器漏洞
- Oracle EBS AP 发票放弃行
- Python之函数进阶
- IDEA安装JRebel插件教程
- Ubuntu设置静态IP/网关
- 【毕设教程】物联网/嵌入式/单片机毕业设计项目开发流程
- html5模板md风格,使用CSS3 制作一个material-design 风格登录界面实例
- ps盖印图层在哪里_PS如何盖印图层?PS盖印图层快捷键
- 解决无法解析服务器DNS地址
- 7.8 最优二叉树与哈夫曼编码
- 新技术加速隐私暴露,如何应对?
- phpcms编辑器添加一键排版控件
- 幼师计算机能力自我评价,幼师简历范文
- 论如何退出学生端······