【Trie】背单词
参考博客:
https://www.luogu.org/problemnew/solution/P3294
https://blog.csdn.net/VictoryCzt/article/details/87186287
【题意】
题意如果看不懂,请到第二个链接去推一推事例,你就明白这个过程了。
来自题解中glf大佬的解析。
这题目描述真是令人窒息。
3个条件的意思大概是这样:
(1).如果有单词作为现在正在填入的单词的后缀但并未填入,将花费n*n的代价。
(2).如果没有单词作为当前填入单词的后缀,代价为当前填入单词序号x
(3).如果所有作为该单词的后缀的单词之前都已经填入,那么代价为当前序号x-最后一个作为当前单词的后缀的单词的序号y。
【题解】
读懂题以后这道题还是比较明显的贪心。第1个条件提示一定是先将所有作为后缀的单词填入,因为如果不这样填不管怎么样代价都小于n*n。
由于询问的是后缀,所以后缀相同其实等价于反串的前缀相同,所以倒着建立一个trie树。
这时问题转化为求一棵树的拓扑序,满足儿子与父亲的编号差的和最小,所以可以直接贪心来做,简单观察发现,对于某一刻,无论选哪个节点,总代价都会增大目前能扫到的第一个标记点的总量。
要使总代价最少,那么这次选的点一定要使以后增加的点最小.
所以记录一下每个点能看到的,以及这一个子树下分支总量,一定优先处理分支更小的子树。
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 5e5 + 1e4 + ;
const int M = N * ;
long long ans = ;
char s[M];
int n,idx;
int End[M],Son[N*][];
int pre[M],ID[M],Sz[M],num;
vector< int > G[N] ;
int Find( int x ){
if(pre[x]==x)return pre[x];
else return pre[x]=Find(pre[x]);
}
void Insert(int No){
int p = ;
for(int i=strlen(s)-; ~i ; i--){
int t = s[i] - 'a';
if( !Son[p][t] ) Son[p][t] = ++idx;
p = Son[p][t];
}
End[p] = No ;
}
void Build(int x ){
for(int i=;i<;i++){
int t = Son[x][i] ;
if( t ) {
if( !End[t] ){
pre[t] = Find(x);
}else{
G[End[Find(x)]].push_back(End[t]);
}
Build(t);
}
}
}
int cmp(int u, int v ){
return Sz[u] < Sz[v] ;
}
void dfs_Size( int u ){
Sz[u] = ;
for(auto x : G[u] ){
dfs_Size(x);
Sz[u] += Sz[x];
}
sort ( G[u].begin() , G[u].end() , cmp );
}
void dfs_Sum(int u){
ID[u] = num ++ ;
for( auto x : G[u] ){
ans += num - ID[u];
dfs_Sum(x);
}
}
void Check(int x)
{
for( auto v : G[x] )
{
cout<<v<<endl;
Check(v);
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s);
Insert(i);
}
for(int i=;i<=idx;i++){
pre[i] = i ;
}
Build() ;
dfs_Size();
dfs_Sum();
//Check(0);
printf("%lld\n",ans);
return ;
}
【Trie】背单词的更多相关文章
- [SCOI2016]背单词——trie树相关
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...
- 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心
[BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
- 「SCOI2016」背单词 解题报告
「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...
- loj#2012. 「SCOI2016」背单词
题目链接 loj#2012. 「SCOI2016」背单词 题解 题面描述有点不清楚. 考虑贪心 type1的花费一定不会是优的,不考虑, 所以先把后缀填进去,对于反串建trie树, 先填父亲再填儿子, ...
- P3294 [SCOI2016]背单词
P3294 [SCOI2016]背单词 Trie+贪心 倒插进树+取出重建+子树处理+贪心遍历 倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中 取出重建:重新建立一棵以单词为节点的树,如果 ...
- 4567: [Scoi2016]背单词
4567: [Scoi2016]背单词 https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题意: 题意看了好久,最后在其他人的博客里看懂了的. ...
- BNU27935——我爱背单词——————【数组模拟】
我爱背单词 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class name: ...
- 【bzoj4567】[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][ ...
- 洛谷 P2353 背单词
题目背景 小明对英语一窍不通,令老师十分头疼.于是期末考试前夕,小明被逼着开始背单词…… 题目描述 老师给了小明一篇长度为N的英语文章,然后让小明背M个单词.为了确保小明不会在背单词时睡着,老师会向他 ...
- [SCOI2016]背单词 题解
背单词 https://www.luogu.com.cn/problem/P3294 前言: Trie树的省选题(瑟瑟发抖QAQ) 问题汇总:(请忽略) (1)对Trie字典树的运用不熟练 (2)没想 ...
随机推荐
- python定时任务实现
安装 pip install schedule 示例代码 import schedule import time def job(): print("I'm working..." ...
- pwn学习日记Day7 基础知识积累
知识杂项 strncpy(char s1,const char s2,int n); 其中有三个参数分别表示目标字符串s1,源字符串s2,拷贝长度.意思是将s2指向的字符串的前n个长度的字符放到s1指 ...
- vue不同序号的元素添加不同的样式
vue不同序号的元素添加不同的样式 一.总结 一句话总结: 在vue中设计一个样式的数据数组来遍历即可 <script> new Vue({ el:'#review_exam_part', ...
- 利用socket实现聊天-Android端核心代码
实体类与服务端报错一致,包括包名 package loaderman.im.bean; /** * 一个聊天消息的JavaBean * * */ public class ChatMsgEntity ...
- 防止sshd服务被暴力破解
方法有很多种,这里介绍两种. (1).配置安全的shhd设置 不允许root用户直接登录到系统,添加一个普通用户,必要时再切换到root用户. 修改默认端口号. 不允许密码登录,只能通过密钥登录系统. ...
- es6 是否包含字符串判断
字符串查找类 接下来介绍一些可以通过 ES5 PolyFill的方法,但是现在 ES6 原生实现了 Method Param Return Description includes() 需要验证是否被 ...
- SQLAlchemy如何筛选值为None的列?那么django呢
示例 from sqlalchemy import create_engine, MetaData, and_, or_, TIMESTAMP Plugin.query.filter(and_(Plu ...
- CSS - clearfix清除浮动
首先,我们来解释一下为什么要使用 clearfix(清除浮动). 通常我们在写html+css的时候,如果一个父级元素内部的子元素是浮动的(float),那么常会发生父元素不能被子元素正常撑开的情况, ...
- ubuntu安装ubuntu-kylin-software-center
sudo apt-get updatesudo apt-get upgradesudo apt-get install --reinstall ubuntu-kylin-software-center ...
- Facebook程序员跳楼事件:技术路线会越走越窄吗?
这是小川的第417次更新,第450篇原创 这几天有个刷屏的文章,讲的是Facebook有位程序员跳楼了,这位程序员的一些信息也"被曝光",比如年轻时是浙大的学霸,后来又赴美读硕,中 ...