[SCOI2016] 背单词 (Trie树)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#define ll long long
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
vector<int> ve[MAXN];
struct node{
int u,v,nex;
}x[MAXN<<];
int head[MAXN],cnt;
void add(int u,int v){
x[cnt].u=u,x[cnt].v=v,x[cnt].nex=head[u],head[u]=cnt++;
}
int ch[MAXN][],bo[MAXN],siz[MAXN],tot=;
struct Trie{
void init(){memset(ch,-,sizeof(ch));}
void insert(char *s){
int len=strlen(s);
int u=;
for(int i=len-;i>=;i--){
int c=s[i]-'a';
if(ch[u][c]==-) {
ch[u][c]=++tot;
add(u,ch[u][c]);
}
u=ch[u][c];
}
bo[u]++;
return;
}
}trie;
void build(int u,int spe){
if(bo[u]) ve[spe].push_back(u),spe=u;
for(int i=head[u];i!=-;i=x[i].nex) build(x[i].v,spe);
}
int n;
void init_siz(int u){
siz[u]=;
int Siz=ve[u].size();
for(int i=;i<Siz;i++){
init_siz(ve[u][i]);
siz[u]+=siz[ve[u][i]];
}return;
}ll Tot,ans;
bool cmp(int xx,int yy){
return siz[xx]<siz[yy];
}
void query(int u,int time){
// printf("u:%d time:%d\n",u,time);
int p=++Tot;
ans+=(ll)p-time;
sort(ve[u].begin(),ve[u].end(),cmp);
int siz=ve[u].size();
for(int i=;i<siz;i++) query(ve[u][i],p);
return;
}
char str[MAXN],str1[MAXN];
signed main(){
// freopen("word.in","r",stdin);
memset(head,-,sizeof(head));
trie.init();
n=read();
for(int i=;i<=n;i++){
scanf("%s",str);
trie.insert(str);
}
build(,);
init_siz();
query(,);
printf("%lld\n",ans);
}/*
2
aa
aaa
*/
[SCOI2016] 背单词 (Trie树)的更多相关文章
- 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心
[BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
- [SCOI2016]背单词——trie树相关
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...
- [SCOI2016] 背单词 (Trie 树,贪心)
题目链接 大致题意 给你 \(n\) 个字符串, 要求你给出最小的代价. 对于每个字符串: 1.如果它的后缀在它之后,那么代价为 \(n^2\). 2.如果一个字符串没有后缀,那么代价为 \(x\), ...
- BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...
- [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的一个排列 ...
- P3294 [SCOI2016]背单词
P3294 [SCOI2016]背单词 Trie+贪心 倒插进树+取出重建+子树处理+贪心遍历 倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中 取出重建:重新建立一棵以单词为节点的树,如果 ...
- 4567: [Scoi2016]背单词
4567: [Scoi2016]背单词 https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题意: 题意看了好久,最后在其他人的博客里看懂了的. ...
- 【bzoj4567】[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][ ...
- BZOJ4567[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...
随机推荐
- kali linux执行apt-get update失败(数字签名过期)
想要安装某个软件,执行apt-get update 失败,出现下面的错误: 自己查看了更新源是没有问题的,根据提示的错误google了一下,发现是数字签名过期了. 执行下面命令: apt-key ad ...
- 让CentOS在同一个窗口打开文件夹
http://www.linuxidc.com/Linux/2010-04/25756.htm
- No.1000_第五次团队会议
光辉的一夜 今夜注定是不平凡的一夜.是崔强同学伟大的一夜. 昨天因为实验室项目,我刚上完编译课就被学院叫走去做项目,当时我就很无奈,因为说好了要和崔强一起实现下午的前端,他写界面我写底层逻辑,这样我们 ...
- Python数据结构练习
1. 给定列表L,如[2,5,3,8,10,1],对其进行升序排序并输出. 代码: list = [2,5,8,10,1] print(list) list.sort() print(list) 2. ...
- Java 面试-- 1
JAVA面试精选[Java基础第一部分] 这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱.只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了 ...
- 1001.A+B Format (20) 解题
代码入口(https://github.com/NSDie/object-oriented) 这题的解题思路我有两个: 第一个是两个数字相加然后判断位数,因为题目限制了范围1000000的绝对值以内嘛 ...
- sqlserver结束和监视耗时的sql
在对象资源管理器中右击服务器地址选择“活动和监视器”. 点击最近耗费大量资源的查询
- golang数据类型转换
int--string //string到int value_int,err:=strconv.Atoi(string) //int到string str:=strconv.Itoa(value_in ...
- 网桥 以及 IEEE802.1D 生成树协议
(一)网桥 网桥是一个layer 2设备,能够连接两个不同的网段. 如图
- PHP 多进程开发
pcntl_fork(); https://blog.csdn.net/wujiangwei567/article/details/77006724 https://blog.csdn.net/qq_ ...