参考博客:

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. springboot连接mongodb进行CRUD

    springboot连接mongodb进行CRUD的过程: 在执行以下操作前已安装了mongodb并创建了用户和数据库,使用Robo 3T可成功连接. 1.创建springboot项目,加入以下mav ...

  2. ORM SQLAlchemy 表于表的关系

    1表与表之间三种关系 1.1 一对一关系 举例: 一个丈夫对应一个妻子,一个妻子对应一个丈夫 1.2 一对多关系 举例:一个人可以拥有多辆汽车,要求查询某个人拥有的所有车辆 分析:这种情况其实也可以采 ...

  3. HearthBuddy 召唤随从的问题

    代码如下,在SilverFish\SilverFish\ai\Playfield.cs文件中 public void callKid(CardDB.Card c, int zonepos, bool ...

  4. Infralution.Localization.Wpf

    WPF Localization Using RESX Files Once you have downloaded the source code and built it, add a refer ...

  5. hey is a tiny program that sends some load to a web application.

    hey is a tiny program that sends some load to a web application. DOS attack DOS攻击生成 https://github.c ...

  6. UML期末复习题——2.4:Domain Model

    第四题:领域模型 重要概念: 1. 领域模型:是对领域内的概念类或现实世界中对象的可视化表示.领域模型也称为概念模型,领域对象模型和分析对象模型. 2. 应用UML表示法,领域模型被描述为一组没有定义 ...

  7. ubuntu tensorflow cpu faster-rcnn 测试自己训练的模型

    (flappbird) luo@luo-All-Series:~/MyFile/tf-faster-rcnn_box$ (flappbird) luo@luo-All-Series:~/MyFile/ ...

  8. mac下的夜神模拟器链接vscode

    1.找到夜神模拟器,点击右键,查看包内容,找到文件夹下面的macos在点击右键打开终端.输入: adb connect 127.0.0.1:62001 dart和flutter交流群:45289287 ...

  9. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_20-CMS前端页面查询开发-页面原型-页面内容完善

    访问swaggerUI的接口 得到返回的json数据,就是我们页面上要显示的数据 复制到页面的数据这里 [ { "siteId": "5a751fab6abb5044e0 ...

  10. leetcode 区间合并

    个区间若能合并,则第一个区间的右端点一定不小于第二个区间的左端点.所以先把区间集合按照左端点从小到大进行排序,接着从第一个区间开始遍历,对每个区间执行如下操作: 1.首先保存该区间的左端点start和 ...