【BZOJ4567】[Scoi2016]背单词 Trie树+贪心
【BZOJ4567】[Scoi2016]背单词
Description
Input
Output
Lweb 吃的最少泡椒数
Sample Input
a
ba
Sample Output
题解:我们将单词倒序扔到Trie树中去,然后根据贪心可知如果想填入一个单词,那么它父亲节点上的单词一定已经被填入,现在的问题就是我们如何处理一个父亲的多个儿子的填入顺序。
又根据贪心可知,如果一个单词有多个儿子,那么一定先走子树最小的那个儿子,这是可证明的,但我懒啊~
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int n,tot,cnt,now;
long long ans;
const int maxn=100010;
struct node
{
int ch[26],v,sm,from;
}p[500010];
char str[500010];
int fa[maxn],next[maxn],head[maxn],to[maxn],pos[maxn],q[maxn],siz[maxn],s[maxn],Q[maxn];
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs1(int x)
{
siz[x]=1;
for(int i=head[x];i!=-1;i=next[i]) dfs1(to[i]),siz[x]+=siz[to[i]];
}
bool cmp(int a,int b)
{
return siz[a]<siz[b];
}
void dfs2(int x)
{
int i,sum=0;
ans+=s[x]-s[fa[x]];
for(i=head[x];i!=-1;i=next[i]) q[++sum]=to[i];
sort(q+1,q+sum+1,cmp);
for(sum=0,i=head[x];i!=-1;i=next[i]) to[i]=q[++sum];
for(i=head[x];i!=-1;i=next[i]) s[to[i]]=++now,dfs2(to[i]);
}
int main()
{
scanf("%d",&n);
int i,j,a,b,u;
tot=1;
for(i=1;i<=n;i++)
{
scanf("%s",str);
a=strlen(str);
for(u=1,j=a-1;j>=0;j--)
{
b=str[j]-'a';
if(!p[u].ch[b]) p[u].ch[b]=++tot,p[p[u].ch[b]].from=u;
u=p[u].ch[b];
}
p[u].v=i,pos[i]=u;;
}
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++)
{
u=p[pos[i]].from;
while(u!=1&&!p[u].v) u=p[u].from;
fa[i]=p[u].v,add(fa[i],i);
}
dfs1(0),dfs2(0);
printf("%lld",ans);
return 0;
}
【BZOJ4567】[Scoi2016]背单词 Trie树+贪心的更多相关文章
- [SCOI2016] 背单词 (Trie 树,贪心)
题目链接 大致题意 给你 \(n\) 个字符串, 要求你给出最小的代价. 对于每个字符串: 1.如果它的后缀在它之后,那么代价为 \(n^2\). 2.如果一个字符串没有后缀,那么代价为 \(x\), ...
- [SCOI2016]背单词——trie树相关
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...
- [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的一个排列 ...
- BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...
- BZOJ4567[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...
- BZOJ4567 [Scoi2016]背单词 【trie树 + 贪心】
题目链接 BZOJ4567 题解 题意真是鬼畜= = 意思就是说我们应先将一个串的所有后缀都插入之后再插入这个串,产生代价为其到上一个后缀的距离 我们翻转一下串,转化为前缀,就可以建\(trie\)树 ...
- [bzoj4567][Scoi2016][背单词] (贪心+trie树)
Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...
- 2019.03.25 bzoj4567: [Scoi2016]背单词(trie+贪心)
传送门 题意: 给你n个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串s的位置为x): 1.排在s后面的字符串有s的后缀,则代价为n^2: 2.排在s前面的字符串有s的后缀,且没有排在s ...
随机推荐
- 【转】C# 视频监控系列(13):H264播放器——控制播放和截图
本文原文地址:http://www.cnblogs.com/over140/archive/2009/03/30/1421531.html 阿里云栖社区也有相关的视频开发案例:https://yq.a ...
- python--文件处理范例
import os,os.path,string dir="D:\\curl\\data" if (os.path.exists(dir)==False): print " ...
- java 解析webservice 中的soapheader
//从MessageContet中获取头域中的值 public HeaderBean getBeanFromRequest(org.apache.axis2.context.MessageContex ...
- ssh理论知识
一.spring工作原理: 1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.DispatcherSer ...
- Kafka 快速起步
Kafka 快速起步 原创 2017-01-05 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 主要内容:1. kafka 安装.启动2. 消息的 ...
- unity, access standard shared emission by script
unity 5.1.1f1 personal 用下面方法在脚本中设置standard shader的emssion: gameObject.GetComponent<MeshRenderer&g ...
- Nginx图片的防盗链配置
[root@web01 www]# cat /app/server/nginx/conf/vhosts/default.conf server { listen default_server; ser ...
- Python unittest 参数化
准备工作: pip install nose_parameterized 典型场景:用户名.密码参数化 实例 1,新建一个ftl.py 文件 ,用来将存在于.txt .xlsx 文件中的参数化数据转 ...
- day5:协成函数与import、for...import...的使用
一.协程函数 1.把函数的执行结果封装好__iter__和__next__,即得到一个迭代器2.与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值 ...
- java虚拟机的逃逸分析
逃逸分析作为其他优化手段提供依据的分析技术,其基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,称为方法逃逸.甚至还有可能被外部线程 ...