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

  1. [luogu] P3294 [SCOI2016]背单词 (贪心)

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

  2. 洛谷P3294 [SCOI2016]背单词——题解

    题目传送 阅读理解题题意解释可以看这位大佬的博客. 发现求后缀与倒序求前缀是等价的,而找前缀自然就想到了trie树.将所有字符串翻转后再建入trie树中,再对每一个字符串翻转后从trie树中找前缀,就 ...

  3. BZOJ4567[Scoi2016]背单词

    4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...

  4. 4567: [Scoi2016]背单词

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

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

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

  6. 【bzoj4567】[Scoi2016]背单词

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

  7. [SCOI2016]背单词 题解

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

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

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

  9. Luogu P3294 【[SCOI2016]背单词】

    阅读理解题 ...... $Trie$ 后缀问题不好处理,我们把它转化为前缀问题,用字典树解决问题 贪心 容易想到,一个串的后缀要先于它插入 对于一个串和其若干后缀串,容易想到,我们要先插入后缀串 然 ...

随机推荐

  1. Codeforces Round #435 (Div. 2)

    A. Mahmoud and Ehab and the MEX 题目链接:http://codeforces.com/contest/862/problem/A 题目意思:现在一个数列中有n个数,每个 ...

  2. 用PHP编写一个APP的API

    第一部分,通信接口的实现 标签(空格分隔): PHP 手机后台 api 通信接口 Andy PHP开发手机API时,一般返回XML或JSON数据类型的数据,除了要返回从源数据(程序本身需要的数据)外还 ...

  3. Mybatis 代码自动生成[myeclipse版]

    使用环境说明: OS:windows 7 64位 myeclipse: 2017 CI 1.安装 打开myeclipse--help---Install from catalog--选择eclipse ...

  4. 自定义vueawesomeswiper分页器样式

    swiperOption: {//swiper的配置项 notNextTick: true,//想获得swiper实例对象,这个必须为true direction: 'vertical', // gr ...

  5. celery消息的编码和序列化(转)

    add by zhj: 原文讲的是序列化时的安全问题,不过,我关心的是怎样可以看到消息队列中的数据.下面是在broker中看到的消息,body是先用 body_encoding编码,然后用conten ...

  6. Android应用之——百度地图最新SDK3.0应用,实现最经常使用的标注覆盖物以及弹出窗覆盖物

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yanglfree/article/details/33333413 一.概述 最新版的百度地图SDK ...

  7. XMind思维导图自定义图标/图片

  8. 系列解读Dropout

    本文主要介绍Dropout及延伸下来的一些方法,以便更深入的理解. 想要提高CNN的表达或分类能力,最直接的方法就是采用更深的网络和更多的神经元,即deeper and wider.但是,复杂的网络也 ...

  9. 【Cocos2dx 3.3 Lua】导出Cocos2dx API文档

    一.Doxygen导出Cocos2dx html doc              1.1 打开Doxygen软件,选择 File-->Open打开Cocos2dx docs目录下的doxyge ...

  10. matlab 以excel格式将字符串数组写入TXT文件

    [m, n] = size(FFoutpu);fp = fopen('FFoutpu.txt','wt');fprintf(fp, 'name CODE ROTC EBIT_EV SHIZHI ROT ...