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 ;
}

最新文章

  1. 【Linux】使用update-alternatives命令进行版本的切换
  2. style
  3. 基于Windows服务器集群的Redis主从配置指南
  4. zju(7)ADC操作实验
  5. Hibernate3回顾-2-相关概念
  6. MD5/SHA加密
  7. Extjs之combobox联动
  8. 【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)
  9. 2018秋季C语言学习总结
  10. vue 简单实现父组件向子组件传值,简单来说就是子组件肆意妄为的调用父组件里后台返回的值
  11. 自定义Banner
  12. vue与自定义元素的关系
  13. 摄像头录制视频并且保存成mp4
  14. oracle kill 锁
  15. java后台面试知识点总结
  16. 网络编程—代码—TCP网络传输
  17. 返回值为record类型的函 初始化 内存泄漏 复制
  18. polymer-developer guide-registration and lifecycle
  19. Java之环境变量配置
  20. es6关于let和const的总结

热门文章

  1. .Net微服务架构之运行日志分析系统
  2. Oracle Function: NVL
  3. 启用mapredure历史服务器方法
  4. 表优化 altering table OPTIMIZE TABLE `sta_addr_copy`
  5. python的几个注意事项
  6. 优云软件应邀出席 ITSS 数据中心运营管理工作组 2017 年春季研讨会
  7. 如何删除帝国cms面包屑导航中首页链接的/index.html
  8. [vue]webpack&amp;vue组件工程化实践
  9. SQLAlchemy通过models创建数据库表
  10. WebService之Axis2(2):复合类型数据的传递