【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)没想 ...
随机推荐
- 一句话题解&&总结
CF79D Password: 差分.两点取反,本质是匹配!最短路+状压DP 取反是套路,匹配是发现可以把操作进行目的化和阶段化,从而第二次转化问题. 且匹配不会影响别的位置答案 sequence 计 ...
- Qt 线程基础(QThread、QtConcurrent等) 2
使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线 ...
- 如何修改layer-layui中的confirm
需求: 改成 背景: 这个confirm是layui中的layer弹出框,要想修改这个弹出框的内容岂不是要去修改源码?当我在源码里扒拉半天梳理好了逻辑之后,突然意识到,其实我本可以不必这么麻烦的,直接 ...
- Facebook币Libra学习-4.新的智能合约语言Move入门
Move是一种新的编程语言,旨在为Libra Blockchain提供安全可编程的基础.Libra Blockchain中的帐户是任意数量的Move资源和Move模块的容器.提交给Libra Bloc ...
- SQL-W3School-高级:SQL ALTER TABLE 语句
ylbtech-SQL-W3School-高级:SQL ALTER TABLE 语句 1.返回顶部 1. ALTER TABLE 语句 ALTER TABLE 语句用于在已有的表中添加.修改或删除列. ...
- 19 个强大、有趣、又好玩的 Linux 命令!
民工哥技术之路 今天 点击上方“民工哥技术之路”选择“置顶或星标” 每天10点为你分享不一样的干货 1. sl 命令 你会看到一辆火车从屏幕右边开往左边…… 安装 $ sudo apt-get ins ...
- C++ fill fill_n generate generate_n
#include <iostream>#include <algorithm>#include <vector>#include <list>#incl ...
- mvc 接收json 集合 实例
开始测试了一下,后台用实体类接收,所报异常如下 无奈之下只能传为字符串,然后字符串转json 页面代码如下 后台controller如下:
- 查看mycat日志
查看日志: tail -f /usr/local/mycat/logs/wrapper.log
- python中dict对象和字符串string对象互相转换
使用json包 import json dict1 = {"A":"a","B":"b"} # 转换为字符串 json. ...