参考博客:

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】背单词的更多相关文章

  1. [SCOI2016]背单词——trie树相关

    题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...

  2. 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心

    [BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...

  3. 「SCOI2016」背单词 解题报告

    「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...

  4. loj#2012. 「SCOI2016」背单词

    题目链接 loj#2012. 「SCOI2016」背单词 题解 题面描述有点不清楚. 考虑贪心 type1的花费一定不会是优的,不考虑, 所以先把后缀填进去,对于反串建trie树, 先填父亲再填儿子, ...

  5. P3294 [SCOI2016]背单词

    P3294 [SCOI2016]背单词 Trie+贪心 倒插进树+取出重建+子树处理+贪心遍历 倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中 取出重建:重新建立一棵以单词为节点的树,如果 ...

  6. 4567: [Scoi2016]背单词

    4567: [Scoi2016]背单词 https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题意: 题意看了好久,最后在其他人的博客里看懂了的. ...

  7. BNU27935——我爱背单词——————【数组模拟】

    我爱背单词 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name:  ...

  8. 【bzoj4567】[Scoi2016]背单词

    4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][ ...

  9. 洛谷 P2353 背单词

    题目背景 小明对英语一窍不通,令老师十分头疼.于是期末考试前夕,小明被逼着开始背单词…… 题目描述 老师给了小明一篇长度为N的英语文章,然后让小明背M个单词.为了确保小明不会在背单词时睡着,老师会向他 ...

  10. [SCOI2016]背单词 题解

    背单词 https://www.luogu.com.cn/problem/P3294 前言: Trie树的省选题(瑟瑟发抖QAQ) 问题汇总:(请忽略) (1)对Trie字典树的运用不熟练 (2)没想 ...

随机推荐

  1. Hadoop环境搭建|第四篇:hive环境搭建

    一.环境搭建 注意:hive版本不能太高,否则会出现兼容性问题 1.1.上传hive安装包 创建文件夹用于存放hive文件命令:mkdir hive 1.2.解压hive安装包 命令:tar -zxv ...

  2. Java并发指南12:深度解读 java 线程池设计思想及源码实现

    ​深度解读 java 线程池设计思想及源码实现 转自 https://javadoop.com/2017/09/05/java-thread-pool/hmsr=toutiao.io&utm_ ...

  3. Qt之编译MySQL数据库驱动(MSVC)

    Qt之编译MySQL数据库驱动(MSVC) (2013-12-13 20:24:46) 转载▼ 标签: qt mysql qmysql qt编译mysql qt之msvc编译mysql 分类: Qt ...

  4. DBeaver 客户端中时间显示问题解决

    最近工作使用了一段时间的macOS,换了新的数据库客户端 DBeaver,无意中发现客户端显示时间不正确.时间保存之后显示比实际时间多13个小时整.可以判断是时区没有配置正确.无意中发现是DBeave ...

  5. git 新建仓库第一次提交

    1 . git init //初始化仓库,在初始化的目录中会出现.git的文件夹 2. git add .(文件name) //添加文件到本地仓   3. git commit -m "fi ...

  6. Linux命令:hexdump

    hexdump是Linux下的一个二进制文件查看工具,它可以将二进制文件转换为ASCII.八进制.十进制.十六进制格式进行查看. 指令所在路径:/usr/bin/hexdump 命令语法: hexdu ...

  7. [Java复习] Spring Framework 框架小结

    Spring 总共大约有 20 个模块,由 1300 多个不同的文件构成. 而这些组件被分别整合在   核心容器 (Core Container),   AOP(Aspect Oriented Pro ...

  8. Apache实现一台服务器上运行多个网站

    总共有三种方法:通过不同的IP地址 通过不同的域名 通过不同的端口号 (1).通过不同的IP地址实现 例如一台CentOS7有两个IP:192.168.5.101和192.168.5.103 [roo ...

  9. RocketMQ采坑记

    先来一篇解释比较多的实例 https://www.cnblogs.com/super-d2/p/4154541.html No route info of this topic, PushTopic ...

  10. jenkins容器内修改root密码--ubuntu系统

    http://www.voidcn.com/article/p-yvnoogkc-ng.html 由于jenkins官方镜像是ubuntu系统,所有啥的都用 sudo 换到root账号,然后登陆har ...