4567: [Scoi2016]背单词

https://www.lydsy.com/JudgeOnline/problem.php?id=4567

题意:

  题意看了好久,最后在其他人的博客里看懂了的。

  n个字符串,给它们排一个顺序。花费最小。对于第x个位置字符串的花费如下计算是这样的:

  • 如果存在它的一个后缀单词在它的后面,花费为x*x
  • 如果它的所有后缀单词都在它前面了,花费为x-last_pos(last_pos为它的后缀单词最后一个出现的位置,如果没有则为0)。

分析:

  贪心 + dfs序。

  首先第一个花费一定是不优的。那就是一个单词在它的所有的后缀单词的后面。

  然后反着建出trie树。把非单词结尾的节点去掉,然后形成一棵树。现在就是给这棵树编号,花费为所有的Σid[x]-id[fa[x]]。

  贪心的思路:优先给siz小的子树编号。

  理解一下:假设现在又两棵子树,第一棵子树的大小为a,另一棵为b,(a<b)。先给a编号后,子树b的根就是a+1,Ans+=(a+b)-id[fa],先给b编号,子树a的根为b+1,Ans+=(b+1)-id[fa]。然后子树内部的点的花费与父节点的差,所以不论父节点是多少,按照最优的情况编号,不变。

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; int ch[N][], dfn[N], siz[N], val[N], NowTime, Index;
char s[N];
vector<int> T[N];
LL Ans; void Insert(char *s,int n) {
int u = ;
for (int i=n; i>=; --i) {
int c = s[i] - 'a';
if (!ch[u][c]) ch[u][c] = ++Index;
u = ch[u][c];
}
val[u] = ;
}
void build(int u,int fa) {
if (val[u]) T[fa].push_back(u);
for (int i=; i<; ++i)
if (ch[u][i]) build(ch[u][i], val[u] ? u : fa);
}
bool cmp(int a,int b) {
return siz[a] < siz[b];
}
void dfs(int u,int fa) {
dfn[u] = ++NowTime;
if (u != ) Ans += dfn[u] - dfn[fa];
sort(T[u].begin(), T[u].end(), cmp);
for (int i=; i<T[u].size(); ++i) dfs(T[u][i], u);
}
int main() {
int n = read();
Index = ;
for (int i=; i<=n; ++i) {
scanf("%s",s + );
Insert(s, strlen(s + ));
}
build(, );
for (int i=Index; i>=; --i) {
if (!val[i]) continue;
siz[i] = ;
for (int j=; j<T[i].size(); ++j) siz[i] += siz[T[i][j]];
}
dfs(, );
cout << Ans;
return ;
}

4567: [Scoi2016]背单词的更多相关文章

  1. bzoj 4567: [Scoi2016]背单词

    Description Lweb 面对如山的英语单词,陷入了深深的沉思,"我怎么样才能快点学完,然后去玩三国杀呢?".这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册 ...

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

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

  3. BZOJ4567[Scoi2016]背单词

    4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...

  4. 【bzoj4567】[Scoi2016]背单词

    4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][ ...

  5. P3294 [SCOI2016]背单词

    P3294 [SCOI2016]背单词 Trie+贪心 倒插进树+取出重建+子树处理+贪心遍历 倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中 取出重建:重新建立一棵以单词为节点的树,如果 ...

  6. 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心

    [BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...

  7. [SCOI2016]背单词——trie树相关

    题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...

  8. [SCOI2016]背单词 题解

    背单词 https://www.luogu.com.cn/problem/P3294 前言: Trie树的省选题(瑟瑟发抖QAQ) 问题汇总:(请忽略) (1)对Trie字典树的运用不熟练 (2)没想 ...

  9. [BZOJ4567][SCOI2016]背单词(Trie+贪心)

    1.题意表述十分难以理解,简单说就是:有n个单词,确定一个背的顺序,使总代价最小. 2.因为第(1)种情况的代价是n*n,这个代价比任何一种不出现第(1)种情况的方案都要大,所以最后肯定不会出现“背某 ...

随机推荐

  1. js获取7天之前或之后的日期

    function fun_date(aa){ var date1 = new Date(), time1=date1.getFullYear()+"-"+(date1.getMon ...

  2. bootstrap Switch 的一个坑点

    在bootstrap的modal点开的时候改变bootstrapSwitch的状态的时候,会出现第一次打开modal,switch没有变化,第二次以后打开modal才会改变,这个问题找了好久没有找到答 ...

  3. SOJ3266 Birthday

    Time Limit: 1000MS Memory Limit: 65536 K Description Today is Windy's birthday. What can I say? Inpu ...

  4. PowerShell交互下的热键

  5. ssm框架基本流程

    题目,写的有点大了,其实就是 对一张表的基本处理,增删改查的基本操作演示. 好了,我们开始了. 假如,我们在做一个单表处理,就举例是 学院(某个大学的学院) 吧. 首先,我们分析 学校这样表有哪些属性 ...

  6. Synchronized介绍

    来源 https://www.imooc.com/learn/1086 作用 ​ 同步方法支持一种简单的策略来防止线程干扰和内存一致性错误,如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都 ...

  7. Mysql数据库的简单语法

    Mysql数据库是目前使用最为广泛的数据对,对于小型企业的支持度,比oracle数据库友好很多. mysql数据库的基本语法 1:创建并且使用数据库 找出服务器上当前存在什么数据库: SHOW DAT ...

  8. CSU 1726: 你经历过绝望吗?两次!(bfs+优先队列)

    传送门: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1726 1726: 你经历过绝望吗?两次! Submit Page    Summar ...

  9. careercup-扩展性和存储限制10.6

    题目 你有10亿个url,每个url对应一个非常大的网页.你怎么检测重复的网页? 解答 网页大,数量多,要把它们载入内存是不现实的. 因此我们需要一个更简短的方式来表示这些网页.而hash表正是干这事 ...

  10. 前端基础-CSS的属性相关设置

    一 字体属性 二 文本属性 三 背景属性 四 盒子模型 五 盒子模型各部分详解 一. 字体属性 1.font-weight:文字粗细(表格中*为重点) 取值 描述   normal 默认值,标准粗细 ...