bzoj4567 背单词
Description
Input
Output
Lweb 吃的最少泡椒数
Sample Input
a
ba
Sample Output
给你n个字符串,不同的排列有不同的代价,代价按照如下方式计算(字符串s的位置为x):
1.排在s后面的字符串有s的后缀,则代价为n^2;
2.排在s前面的字符串有s的后缀,且没有排在s后面的s的后缀,则代价为x-y(y为最后一个与s不相等的后缀的位置);
3.s没有后缀,则代价为x。
根据后缀的条件,我们可以判断出这道题可以用trie树。当然我们需要反向存字符串。
然后我们可以知道,对于一个字符串,只有它的第一个点(翻转之前)是对我们有用的,比如:ABCD,BCD我们只用记录A有一条向B的边。
我们先正常建树,然后标记所有末尾点,如果这个点的父亲是它的前缀,那么就连一条父亲到他的边。
对于取字符策略,考虑贪心。对于一个点,我们优先选择那个最小的子树,从小到大,依次枚举。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define REP(i,k,n) for(long long i=k;i<=n;i++)
#define in(a) a=read()
#define MAXN 510010
using namespace std;
inline long long read(){
long long x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
long long n;
long long cnt=;
long long f[MAXN];
long long total=,head[MAXN],nxt[MAXN],to[MAXN];
long long tree[MAXN][],isend[MAXN];
long long size[MAXN];
long long dfn[MAXN],ind=,ans=;
long long top=;
struct node{
long long si,in;
}arr[MAXN];
inline void adl(long long a,long long b){
total++;
// cout<<total<<" "<<a<<" "<<b<<endl;
to[total]=b;
nxt[total]=head[a];
head[a]=total;
return ;
}
inline void insert(char *s){
long long u=;
for(long long i=strlen(s)-;i>=;i--){
if(!tree[u][s[i]-'a']) tree[u][s[i]-'a']=++cnt;
u=tree[u][s[i]-'a'];
}
//cout<<u<<endl;
isend[u]=;
return ;
}
inline void build(long long u,long long f){
if(isend[u]){
adl(f,u);
f=u;
}
REP(i,,)
if(tree[u][i])
build(tree[u][i],f);
return ;
}
inline void getsize(long long u){
size[u]=;
for(long long e=head[u];e;e=nxt[e]){
getsize(to[e]);
size[u]+=size[to[e]];
}
return ;
}
inline bool cmp(node a,node b){
return a.si<b.si;
}
inline void getans(long long u){
dfn[u]=++ind;
long long m=top+;
for(long long e=head[u];e;e=nxt[e]){
arr[++top].in=to[e];
arr[top].si=size[to[e]];
}
if(top<m) return ;
sort(arr+m,arr+top+,cmp);
REP(i,m,top){
getans(arr[i].in);
ans+=dfn[arr[i].in]-dfn[u];
//cout<<u<<" "<<arr[i].in<<" "<<ans<<endl;
}
top=m-;
return ;
}
int main(){
in(n);
char c[];
REP(i,,n){
scanf("%s",c);
insert(c);
}
build(,);
getsize();
getans();
cout<<ans;
}
/*
4
da
dcba
ba
cba
*/
bzoj4567 背单词的更多相关文章
- 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心
[BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
- BZOJ4567[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...
- 【bzoj4567】[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][ ...
- 做中学(Learning by Doing)之背单词-扇贝网推荐
做中学(Learning by Doing)之背单词-扇贝网推荐 看完杨贵福老师(博客,知乎专栏,豆瓣)的「继续背单词,8个月过去了」,我就有写这篇文章的冲动了,杨老师说: 有时候我会感觉非常后悔,如 ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...
- 《我爱背单词》 Alpha版 发布说明
——发布地址(baidu网盘) http://pan.baidu.com/s/15omtB ——简介 <我爱背单词>是一款英语单词记忆和管理辅助软件,旨在帮助广大考生在短期内攻克GRE. ...
- [No000057]一个人默默背单词,小心被传染哦
不日凛冬将至,全国各地,已有多名少侠因季节变化,出现了不同程度的四肢不勤.bd不分的症状.具体表现为—— 包大人在此高能预警:不想背单词,有可能你已经被传染了. 好好的,怎么突然不想背单词了 哈佛医学 ...
- [No000014]听说不背单词,考英语会是这种下场-我们为什么必须背单词?
由于英语对于一个程序员来说,重要性你懂得.因此我会开始逐渐在博客上加入英语的一些东西. 听说不背单词,考英语会是这种下场 在中国, 「学英语」大抵遵循着这样一条 罗蒙诺索夫质量守恒定律 因为英语学着学 ...
- Supermemo背单词7周年纪念
从2007年2月1日开始,用Supermemo背单词7周年了,在2013年11月21日将单词表Reset,重新开始Review以前背过的单词,并慢慢加入听写VOA时遇到的生词.
随机推荐
- Linux Deploy 使用 Repository部署Linux系统
Linux Deploy 使用 Repository部署Linux系统 为了解决镜像不稳定导致包下载错误,能得到一个稳定环境,可以使用linux deploy导出功能. 这里提供两个制作好的包 用户名 ...
- shell中$*与$@的区别
$*所有的位置参数,被作为一个单词 注意:"$*"必须被""引用 $@ 与$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被 ...
- Android仿新浪新闻SlidingMenu界面的实现 .
先看看原图: 如图所示,这种侧滑效果以另一种方式替代了原先tab导航的那种用户体验方式 给人耳目一新的感觉,现已被广大知名应用所效仿,如新浪新闻,网易新闻,人人网等 那么这种效果该如何实现呢?那就需要 ...
- go语言入门(二)
Go 语言变量 Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 声明变量的一般形式是使用 var 关键字: var identifier type 变量声明 第一种,指定变量类型, ...
- 一个带重试次数的curl 函数
<?php/** * [curl 带重试次数] * @param [type] $url [访问的url] * @param [type] $post [$POST参数] * @param in ...
- Linux自身安全SElinux
查看SELinux状态: 1./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态 SELinux status: ...
- C语言使用数学库编译不通过问题
#include <stdio.h>#include <math.h> int main(){ double a = 10.0,b = 3.0; f ...
- C++中求类的大小
今天刷题时看到一题,是求类的大小的,其中涉及了内存的一些知识,记录一下. 正确答案是12和9 首先是内存对齐原则,可以参考这篇博文:http://www.cppblog.com/snailcong/a ...
- JAVA封装消息中间件调用二(kafka消费者篇)
上一遍我简单介绍了kafka的生成者使用,调用方式比较简单,今天我给大家分享下封装kafka消费者,作为中间件,我们做的就是最大程度的解耦,使业务方接入我们依赖程度降到最低. 第一步,我们先配置一个消 ...
- 远程连接 mysql 数据库连接不上的解决方案
今天用Navicat访问虚拟机上的mysql,无法访问报cannot connect(10038). 首先看是否可以telnet,本机cmd,telnet 10.10.10.10 3306,结果是连接 ...