我个傻逼,这么水的题还调了那么久。

把所有的串都反过来,建trie树,很明显,不同子树间是不影响的。
一定是先选择父亲节点再选子节点,同一个节点先选子树大小最小的儿子即可。

一开始想错了,以为可以直接再trie树上贪心,后来发现必须要建出新树,因为有的节点公用同一个祖先,但是祖先并不是单词节点,这就很尴尬了。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#define maxn 100010
#define N 520010using namespace std;int ch[N][26],size[N];
vector<pair<int,int> > v[N];
bool tag[N];
int n,tot;
long long ans,now;
char s[N];void insert()
{int len=strlen(s+1),x=0;for (int i=len;i>=1;i--){if (!ch[x][s[i]-'a']) ch[x][s[i]-'a']=++tot;x=ch[x][s[i]-'a'];}tag[x]=1;
}void dfs(int x,int fa)
{if (tag[x]) v[fa].push_back(make_pair(x,0)),fa=x,size[x]=1;for (int i=0;i<26;i++)  if (ch[x][i]) dfs(ch[x][i],fa);for (int i=0;i<v[x].size();i++) size[x]+=size[v[x][i].first],v[x][i]=make_pair(size[v[x][i].first],v[x][i].first);sort(v[x].begin(),v[x].end());
}void dfs1(int x,int w)
{now++;ans+=now-w;w=now;for (int i=0;i<v[x].size();i++) dfs1(v[x][i].second,w);
}int main()
{scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%s",s+1);insert();}dfs(0,0);dfs1(0,0);printf("%lld\n",ans-1);return 0;
}

【bzoj4567】[Scoi2016]背单词 贪心+trie树相关推荐

  1. BZOJ4567 SCOI2016背单词(trie+贪心)

    倒过来变成查询前缀.考虑怎么排序.第一条代价n*n就相当于inf,说明一个单词的所有前缀都要排在它前面.那么串的依赖关系就是trie的结构.二三条说明代价是Σidi-idfa,那么显然最后的编号应该是 ...

  2. LeetCode 758. 字符串中的加粗单词(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个关键词集合 words 和一个字符串 S,将所有 S 中出现的关键词加粗.所有在标签 <b> 和 </b> 中的字母都会加 ...

  3. LeetCode 720. 词典中最长的单词(Trie树)

    1. 题目 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. 若无 ...

  4. 单词压缩编码--Trie树

    问题描述:给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A.例如,如果这个列表是 ["time", "me", "bell ...

  5. 720 词典中最长的单词(Trie树)

    1. 问题描述: 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. ...

  6. BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...

  7. [Scoi2016]背单词[字典树+dfs重构树[类似虚树]]

    解题思路:很明显第一个条件是可以避免的,第二个条件是第三个条件的特殊情况,所以有用的只有第三个条件,现在我们就是想将这些单词重排使得每个单词后缀都在这个单词的前面并且代价最小 我们举个例子: 6 a ...

  8. LeetCode 527. 单词缩写(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个由n个不重复非空字符串组成的数组,你需要按照以下规则为每个单词生成最小的缩写. 初始缩写由起始字母+省略字母的数量+结尾字母组成. 若存在冲突,亦 ...

  9. 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)

    1. 题目 给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下). 不要求这些单词在清单里连续出现,但要求所有行等长, ...

最新文章

  1. 文化内涵和历史深度:PC
  2. 旷视MegEngine数据加载与处理
  3. 捷讯技术分享SSH 无法远程登录问题的处理办法汇总
  4. 表数据比图数据更难处理
  5. Linux系统中文件^M乱码解决
  6. 分支限界法 tsp java_基于分支限界法的旅行商问题(TSP)一
  7. 操作系统,你搞定了没?
  8. 用Javascript实现interface的类似功能
  9. [转]从网页Web上调用本地应用程序(.jar、.exe)的主流处理方法
  10. 2016年最新J2EE基础入门教程目录(完结版)
  11. 通常学校计算机实验室中的网络属于,增霸卡在学校计算机实验室维护中的应用研究...
  12. DirectX Repair(DirectX修复工具)官方中文增强版V4.1.0.30770 | directx repair修复工具增强版下载
  13. spring整合kaptcha验证码
  14. GoogleNet论文解读
  15. 超实用!轻松几步修复灰蒙蒙的情侣合照!
  16. 如何用计算机打出字,两个字中间的点怎么打出来?
  17. [洛谷 P1647]锁 --- 规律 + 二进制
  18. 【干货】洋葱淘elya妞:电商小白产品操盘心得,洋葱淘如何搞到种子用户
  19. 二叉树的遍历(非递归)
  20. 无法使用备份文件 'D:\20160512.bak',因为原先格式化该文件时所用扇区大小为 512,而目前所在设备的扇区大小为 4096...

热门文章

  1. 【本人秃顶程序员】Java程序员,你会选择25k的996还是18k的965?
  2. 你说啥什么?注解你还不会?
  3. Clion远程Linux开发调试环境搭建
  4. java用下拉框实现出生日期_纯JS实现出生日期[年月日]下拉菜单效果
  5. JPEG系列一 JPEG图片的文件格式
  6. 魅蓝手机显示无服务器,魅蓝手机网速显示设置(魅蓝2)
  7. 自控力读书笔记 第九章 别读这章:“我不要”力量的局限性
  8. VMware XP安装安装程序没有找到硬盘驱动器
  9. 快速排序——单边循环实现方式
  10. iframe标签中写html,html页面中嵌套iframe标签,我们可以用html中的iframe标签搞定