BZOJ4567 [SCOI2016]背单词
Address
- BZOJ4567 洛谷P3294
Solution
- 简化下题目,对于排在第 xxx 个位置的串:
1.若存在该串的后缀排在该串后面,该串的代价为 n2" role="presentation">n2n2n^2。
2.若该串没有后缀,代价为 xxx。
3.若该串的所有后缀都排在该串前面,记最靠近该串的后缀位置为 y" role="presentation">yyy,代价为 x−yx−yx - y。 - 显然只要把所有串翻转,则后缀都变成了前缀,建出 TrieTrieTrie 树。
- 接下来把不是串结束位置的无关点去掉,建出一棵新树。
- 容易发现 1. 中代价远大于后两项,但只要按照新树的某个 DFSDFSDFS 序排列就可以完全避免出现 1. 中情况。
- 则问题转化为求新树的所有父子在 DFSDFSDFS 序中距离和的最小值。
- 我们有一个贪心策略:每遍历到一点,都按照子树大小从小到大往下 DFSDFSDFS。
- 因为越先遍历到的子树,就会对之后越多的点的 DFSDFSDFS 序产生影响,因而要使先遍历到的子树大小尽量小。
- 时间复杂度 O(nlogn)O(nlogn)O(n \log n)。
Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <cstdlib>using namespace std;typedef long long ll;
const int N = 51e4 + 5, M = 1e5 + 5;
int n, T = 1, m, tis; ll Ans;
int G[N][27], a[M], fa[N], sze[N], dfn[N];
bool vis[N]; char s[N];struct Edge
{int to; Edge *nxt;
}p[M], *lst[N], *P = p;inline void Link(int x, int y)
{(++P)->nxt = lst[x]; lst[x] = P; P->to = y; fa[y] = x;
} inline void Dfs1(int x, int fa, int lst)
{for (int i = 0; i < 26; ++i){int y = G[x][i];if (!y) continue;if (vis[y]) Link(lst, y), Dfs1(y, x, y);else Dfs1(y, x, lst);}
}inline void Dfs2(int x)
{sze[x] = 1; int y;for (Edge *e = lst[x]; e; e = e->nxt)Dfs2(y = e->to), sze[x] += sze[y];
}inline bool cmp(const int &x, const int &y) {return sze[x] < sze[y];}
inline void Dfs3(int x)
{dfn[x] = ++tis; int lm = m + 1;for (Edge *e = lst[x]; e; e = e->nxt) a[++m] = e->to;int rm = m;sort(a + lm, a + rm + 1, cmp);for (int i = lm; i <= rm; ++i) Dfs3(a[i]);
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; ++i) {scanf("%s", s + 1); int len = strlen(s + 1), x = 1;for (int j = 1, jm = len >> 1; j <= jm; ++j)swap(s[j], s[len - j + 1]); for (int j = 1; j <= len; ++j){int y = s[j] - 'a';if (!G[x][y]) G[x][y] = ++T;x = G[x][y];}vis[x] = true;}Dfs1(1, 0, 1); Dfs2(1); Dfs3(1);for (int i = 1; i <= T; ++i)if (fa[i]) Ans += dfn[i] - dfn[fa[i]]; cout << Ans << endl;
}
BZOJ4567 [SCOI2016]背单词相关推荐
- BZOJ4567 SCOI2016背单词(trie+贪心)
倒过来变成查询前缀.考虑怎么排序.第一条代价n*n就相当于inf,说明一个单词的所有前缀都要排在它前面.那么串的依赖关系就是trie的结构.二三条说明代价是Σidi-idfa,那么显然最后的编号应该是 ...
- 【bzoj4567】[Scoi2016]背单词 贪心+trie树
我个傻逼,这么水的题还调了那么久. 把所有的串都反过来,建trie树,很明显,不同子树间是不影响的. 一定是先选择父亲节点再选子节点,同一个节点先选子树大小最小的儿子即可. 一开始想错了,以为可以直接 ...
- [Scoi2016]背单词[字典树+dfs重构树[类似虚树]]
解题思路:很明显第一个条件是可以避免的,第二个条件是第三个条件的特殊情况,所以有用的只有第三个条件,现在我们就是想将这些单词重排使得每个单词后缀都在这个单词的前面并且代价最小 我们举个例子: 6 a ...
- BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...
- 【青少年编程】黄羽恒:我要背单词
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载&quo ...
- 不用“背”单词,一个方法从普通二本到哥伦比亚大学:我是如何做到的?
"学英语太难.太费劲了."我听过无数人这么说. 然而,我的学员们,却都只用了短短3-6个月时间,就以惊人速度提高了英语: 小磊:勉强踩着2本线上了大学,四级考了3次没过,毕业时却拿 ...
- 别光顾着背单词了,每天花18分钟做这件事,英语水平暴增!
在知乎上看过一个问题:在当今社会,英语还重要吗? 点赞第一的回答是-- 英语可以差,但你的口语一定要好! 你记住了1万个单词.将语法书倒背如流.英语成绩名列前茅.英语证书一大摞. 但你的口语差,看见老 ...
- 少壮不努力,老大背单词
少壮不努力,老大背单词 你必须非常努力,才可以看起来毫不费力 uncouth (adj.) 粗鲁的,不文明的 I am embarrassed by your uncouth manners epit ...
- 微信背单词类小程序,小鸡单词源码下载,打卡微信小程序
微信背单词类小程序,小鸡单词源码下载,微信小程序开发学习案例,小程序开发教程.一个用来背单词每天打卡的微信小程序,还有词汇测试,包含多种词库后台由腾讯云wafer解决方案. 前段时间开始学做微信小程序 ...
- python写背单词软件_python背单词小程序
import random as t #创建单词序列 words=("easy","difficult","answer","co ...
最新文章
- 项目构建之maven篇:2.HelloWorld项目构建过程
- IBM中国CTO程静:现代CTO是怎样炼成的
- 【转】nagios 命令解释
- Centos7 下部署PPTP
- 20145105 《Java程序设计》第5周学习总结
- .mmp怎么打开查看?
- yum更换本地源、yum下载和源码包安装
- PyQt5学习笔记02----初探Qt Designer 设计师
- 基于Jenkins的嵌入式软件持续集成方法
- set是无序集合,放入set中的元素通过iterator输出时候是无序的
- OA系统选型:选择好的工作流引擎
- 使用大数据分析需要注意什么因素
- [PHP]全国省市区信息,mysql数据库记录
- 中职学校计算机基础的重要性,中职非计算机专业学生计算机基础教学浅探
- xheditor 内容保存时 不转义html特殊字符,XHEditor使用文档(转载收藏)
- QAM的符号能量及比特能量
- 怎么用计算机ping组播地址,windows – 使用’目标主机无法访问’从同一台计算机ping“回复”(没有到其他计算机的路由)...
- 我的北漂在路上--------时不时的停下脚步思考
- 帧内预测-函数initAdiPattern
- Universal Robot——在Gazebo中模拟UR5机器人
热门文章
- 桌面被关闭,如何在任务管理器中打开桌面?
- 黄小宁罪大恶极!!!!!!!!!!黄小宁罪大恶极!!!!!!!!!!
- jsp页面打开为空白页
- H.264/H.265 视频编码解码器单元产品指南
- 随便举个例子,说明单线程比多线程编程提高性能
- 成都工业学院(成都无机校/电子机械高等专科学校)百年校庆之行记
- 这么清晰的帮助手册,AppCube 二次体验
- 判断一个整数是否是7的倍数
- 今日“春分”,我們來場春天的“飛花令”吧
- mysql if 多个,mysql多个if语句