P3294 [SCOI2016]背单词
Trie+贪心
倒插进树+取出重建+子树处理+贪心遍历
倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中
取出重建:重新建立一棵以单词为节点的树,如果存在包含(前缀)关系就连边
子树处理:处理出每棵树的大小用于贪心
贪心遍历:遍历整棵新树,累加答案
关于贪心:每次找到最小的子树统计答案
end.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
struct data{
int nxt[],end;
data(){memset(nxt,,sizeof(nxt)); end=;}
}a[];
vector <int> g[]; //存边
int n,cnt,len,siz[];
long long f[];
char q[];
inline bool cmp(const int &A,const int &B) {return siz[A]<siz[B];}
inline void read_q(){
char c=getchar(); len=;
while(c<'a'||c>'z') c=getchar();
while('a'<=c&&c<='z') q[len++]=c,c=getchar();
}
inline void insert_(int id){ //建树
read_q();
int u=;
for(int i=len-;i>=;--i){
int p=q[i]-'a';
if(!a[u].nxt[p]) a[u].nxt[p]=++cnt;
u=a[u].nxt[p];
}a[u].end=id; //编号代替单词
}
inline void rebuild(int x,int p){ //重新建树
if(a[x].end) g[p].push_back(a[x].end); //存在前缀关系连边
for(int i=;i<;++i){
int to=a[x].nxt[i];
if(!to) continue;
rebuild(to,a[x].end ? a[x].end:p);
}
}
inline void dfs1(int x){
siz[x]=;
for(int i=;i<g[x].size();++i){
int to=g[x][i];
dfs1(to);
siz[x]+=siz[to];
}
sort(g[x].begin(),g[x].end(),cmp); //按子树从小到大排序
}
inline void dfs2(int x){
f[x]=x? :;
long long tmp=;
for(int i=;i<g[x].size();++i){
int to=g[x][i];
dfs2(to);
f[x]+=f[to]+tmp; //贪心累加答案
tmp+=siz[to];
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i) insert_(i);
rebuild(,);
dfs1();
dfs2();
printf("%lld",f[]);
return ;
}
P3294 [SCOI2016]背单词的更多相关文章
- [luogu] P3294 [SCOI2016]背单词 (贪心)
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,"我怎么样才能快点学完,然后去玩三国杀呢?".这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他 ...
- 洛谷P3294 [SCOI2016]背单词——题解
题目传送 阅读理解题题意解释可以看这位大佬的博客. 发现求后缀与倒序求前缀是等价的,而找前缀自然就想到了trie树.将所有字符串翻转后再建入trie树中,再对每一个字符串翻转后从trie树中找前缀,就 ...
- BZOJ4567[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...
- 4567: [Scoi2016]背单词
4567: [Scoi2016]背单词 https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题意: 题意看了好久,最后在其他人的博客里看懂了的. ...
- 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心
[BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
- 【bzoj4567】[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][ ...
- [SCOI2016]背单词 题解
背单词 https://www.luogu.com.cn/problem/P3294 前言: Trie树的省选题(瑟瑟发抖QAQ) 问题汇总:(请忽略) (1)对Trie字典树的运用不熟练 (2)没想 ...
- [SCOI2016]背单词——trie树相关
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...
- Luogu P3294 【[SCOI2016]背单词】
阅读理解题 ...... $Trie$ 后缀问题不好处理,我们把它转化为前缀问题,用字典树解决问题 贪心 容易想到,一个串的后缀要先于它插入 对于一个串和其若干后缀串,容易想到,我们要先插入后缀串 然 ...
随机推荐
- .NET中的类型对象
.NET中的任何类型,都有对应的一个类型对象.类型对象和类型实例(类型创建的一个对象)不是同一个概念. 类型对象包含类型的静态字段和方法,当类访问静态方法静态字段,实例调用方法时就会去类型对象中查找静 ...
- HandlerThread分析
Handy class for starting a new thread that has a looper. The looper can then be used to create handl ...
- 统计词语频率保存到xls
import json import jieba.analyse as anl import xlwt # 获取待统计的文本内容 # 打开文件 f = open('zhilian.json', 'r' ...
- Web Responsive Table, 只需CSS使table在手机和平板中完美显示
在做responsive或者手机版页面的时候,经常碰到<Table>在手机和平板中会因为长度问题把页面撑大.最近看到一个比较好,比较方便的方法,而且仅仅用CSS 2就可以实现! 实例URL ...
- 2018最新php笔试题及答案(持续更新)
php中include和require的区别 在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容.include 和 require 语句用于在执行流中插入写在其他文件中 ...
- java-mybaits-011-mybatis-拦截器计算耗时
实现Mybatis官方提供的拦截器,用于记录SQL语句的执行时间 package com.github.bjlhx15.mybatis; /** * @author lihongxu * @since ...
- 7.MQTT网页客户端连接MQTT服务器的问题WebSocket connection to 'ws://XXX:1883/' failed: Connection closed before receiving a handshake response
问题描述:MQTT.js提供了连接MQTT的一套javascipt的方法,可供前端连接到MQTT服务器,也可以作为脚本测试.以脚本形式,用nodejs运行,是没有问题的,能够正常连接并且发送报文.但是 ...
- idea 连接数据库
1:如果没有数据库连接插件,下载database插件 settings>plugin>Database Navigator 下载. 2:重启 3:进入 view>tool windo ...
- soapUI-Conditional Goto
1.1.1 Conditional Goto 1.1.1.1 概述 - Conditional Goto Conditional Goto TestStep包含任意数量的XPath/JSONPath ...
- ajax课1 源码
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...