[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 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
随机推荐
- 使用vue-cli启动项目出错
Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向上增量开发的设计. Vue 的目标是通过尽可能简单的 API 实现响应的数据 ...
- 关于mysql的索引原理与慢查询优化
大多情况下我们都知道加索引能提高查询效率,但是应该如何加索引呢?索引的顺序如何呢? 大家看一下下面的sql语句(在没有看下面的优化的方法之前)应该如何优化加索引以及优化sql语句: 1.select ...
- Spark 多项式逻辑回归__二分类
package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{L ...
- 【Learning】多项式的一些东西
FFT 坑 NTT 将\(FFT\)中的单位复数根改成原根即可. 卡常版NTT模版 struct Mul { int Len; int wn[N], Lim; int rev[N]; inline v ...
- PKUACM 2018 D chocolate【并查集+克鲁斯卡尔】
传送:http://poj.openjudge.cn/practice/C18D/ 依然是课件截图 #include<iostream> #include<cstdio> #i ...
- noip2002矩阵覆盖(搜索)
矩阵覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见 ...
- [Swift]Array(数组)扩展
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Nginx(二) 反向代理&负载均衡
1.反向代理 当我们请求一个网站时,nginx会决定由哪台服务器提供服务,就是反向代理. nginx只做请求的转发,后台有多个tomcat服务器提供服务,nginx的功能就是把请求转发给后面的服务器, ...
- css 实现 checkbox 大小调整
一般调整 checkbox 大小我们想到的是 width.height,可是设置后,发现是没有效的. 如微信小程序里面,checkbox 默认就很大,想设置小一点怎么办? transform: sca ...
- [ NOI 2001 ] 方程的解数
\(\\\) \(Description\) 已知一个 \(N\) 元高次方程: \[ k_1x_1^{p_1}+k_2x_2^{p_2}+...+k_nx_n^{p_n}=0 \] 要求所有的 \( ...