[bzoj4567][Scoi2016][背单词] (贪心+trie树)
Description
Input
Output
Lweb 吃的最少泡椒数
Sample Input
a
ba
Sample Output
Solution
可以利用后缀的性质将所有字符串反过来建字典树
那么求最优填词方案也就是求代价最小的访问序,即一个最优的dfs序,这样就可以去掉第一种吃泡椒的方案,因为代价太大
可以证明,优先访问单词数量小的子树更优,满足贪心性质
这样就解出了此题
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MaxN 100010
#define MaxL 500010
namespace io{
#define MaxBuf 1<<22
#define Blue() ((S==T&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S==T))?0:*S++)
char B[MaxBuf],*S=B,*T=B;
template<class Type>inline void Rin(Type &x){
x=;int c=Blue();
for(;c<||c>;c=Blue())
;
for(;c>&&c<;c=Blue())
x=(x<<)+(x<<)+c-;
}
inline void geTc(char *C,int &x){
x=;char c=Blue();
for(;c<'a'||c>'z';c=Blue())
;
for(;c>='a'&&c<='z';c=Blue())
*C++=c,x++;
}
}
int n;
char s[MaxL];
long long ans(0LL);
class Trie{
public:
int ch[MaxL][],tot;
bool val[MaxL];
Trie(){
tot=;
memset(ch,,sizeof ch);
memset(val,false,sizeof val);
}
inline void insert(char *C,int len){
int now=;
for(int i=len-;~i;i--){
if(!ch[now][C[i]-'a'])
ch[now][C[i]-'a']=++tot;
now=ch[now][C[i]-'a'];
}
val[now]=true;
}
}T;
namespace DFS{
int sz[MaxN],q[MaxN],top;
struct Pointer{
int to;
Pointer *next;
}*fir[MaxN];
inline void link(int x,int y){
static Pointer mem[MaxN],*tot=mem;
*++tot=(Pointer){y,fir[x]},fir[x]=tot;
}
void _dfs(int at,int fa){
static int timer=;
if(T.val[at]){
link(fa,++timer);
sz[fa=timer]=;
}
for(int i=;i<;i++)
if(T.ch[at][i])
_dfs(T.ch[at][i],fa);
}
void maintain(int at){
for(Pointer *iter=fir[at];iter;iter=iter->next){
maintain(iter->to);
sz[at]+=sz[iter->to];
}
}
bool cmp(int x,int y){
return sz[x]<sz[y];
}
void calc(int at,int pre){
static int timer;
timer++;
ans+=timer-pre;
pre=timer;
int l=top+,r=top;
for(Pointer *iter=fir[at];iter;iter=iter->next)
q[++r]=iter->to;
std::sort(q+l,q++r,cmp);
top=r;
for(int i=l;i<=r;i++)
calc(q[i],pre);
top=l-;
}
}
int main(){
io::Rin(n);
for(int i=,len;i<=n;i++){
io::geTc(s,len);
T.insert(s,len);
}
DFS::_dfs(,);
DFS::maintain();
DFS::calc(,);
printf("%lld\n",ans);
return ;
}
[bzoj4567][Scoi2016][背单词] (贪心+trie树)的更多相关文章
- BZOJ4567 [Scoi2016]背单词 【trie树 + 贪心】
题目链接 BZOJ4567 题解 题意真是鬼畜= = 意思就是说我们应先将一个串的所有后缀都插入之后再插入这个串,产生代价为其到上一个后缀的距离 我们翻转一下串,转化为前缀,就可以建\(trie\)树 ...
- 2019.03.25 bzoj4567: [Scoi2016]背单词(trie+贪心)
传送门 题意: 给你n个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串s的位置为x): 1.排在s后面的字符串有s的后缀,则代价为n^2: 2.排在s前面的字符串有s的后缀,且没有排在s ...
- BZOJ4567 SCOI2016背单词(trie+贪心)
倒过来变成查询前缀.考虑怎么排序.第一条代价n*n就相当于inf,说明一个单词的所有前缀都要排在它前面.那么串的依赖关系就是trie的结构.二三条说明代价是Σidi-idfa,那么显然最后的编号应该是 ...
- [SCOI2016] 背单词 (Trie树)
$pdf\space solution$ link #include<iostream> #include<algorithm> #include<cstrin ...
- BZOJ4567[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...
- [BZOJ4567][SCOI2016]背单词(Trie+贪心)
1.题意表述十分难以理解,简单说就是:有n个单词,确定一个背的顺序,使总代价最小. 2.因为第(1)种情况的代价是n*n,这个代价比任何一种不出现第(1)种情况的方案都要大,所以最后肯定不会出现“背某 ...
- [bzoj4567][Scoi2016]背单词-Trie+贪心+模型转化
Brief Description 给你N个互不相同的字符串,记\(S_i\)为第i个字符串,现在要求你指定N个串的出现顺序,我们用\(V_i\)表示第i个字符串是第几个出现的,则V为1到N的一个排列 ...
- [Scoi2016]背单词(trie+贪心)
题意:重新解释一下题意吧(题意晦涩难懂) 给定n个单词,你可以按照顺序学习,当学习这一单词时,这个单词是第x个要学习的单词,需要的代价分三类: 1.若存在其他单词是其后缀没被学习,则代价为n2 2.若 ...
- 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心
[BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
随机推荐
- Java IO 字节流与字符流 (五)
Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...
- Real-Time Compressive Tracking,实时压缩感知跟踪算法解读
这是Kaihua Zhang发表在ECCV2012的paper,文中提出了一种基于压缩感知(compressive sensing)的单目标跟踪算法,该算法利用满足压缩感知(compressive s ...
- [App Store Connect帮助]五、管理构建版本(2)查看构建版本和文件大小
您可以查看您为某个 App 上传的所有构建版本,和由 App Store 创建的变体版本的大小.一些构建版本在该 App 发布到 App Store 上后可能不会显示. 必要职能:“帐户持有人”职能. ...
- 在sql语句中使用关键字
背景 开发过程中遇到了遇到了一句sql语句一直报错,看了一下字段名和表名都对应上了,但是还是一直报错 sql语句如下: update table set using = ""hh ...
- [TJOI2012]桥
Description 有n个岛屿,m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前 ...
- 类函数:string、math
类:系统内置的处理字符串类型的函数方法类. string是String的快捷方式.所包含的内容都是一样的. Int i=x.length;//获取一个字符串长度 字符串中,索引号从0开始 String ...
- sql server truncate table 删除表数据限制条件
truncate 注释 注释TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快 ...
- R语言常用数学函数
语言的数学运算和一些简单的函数整理如下: 向量可以进行那些常规的算术运算,不同长度的向量可以相加,这种情况下最短的向量将被循环使用. > x <- 1:4 > a <- 1 ...
- 使ThinkPHP(3.2.3)的分页类支持Bootstrap风格
ThinkPHP 3.2.3自带的分页类位于:/ThinkPHP/Library/Think/Pages.class.php ,官方文档在这里:ThinkPHP3.2.3数据分页 Pages.clas ...
- codeforces_304C_数学题
C. Lucky Permutation Triple time limit per test 2 seconds memory limit per test 256 megabytes input ...