[luogu3294][背单词]
题意
读完题目就一个感受:这出题人tm不会说人话吗。真的感觉这个题理解题意比想出正解更难。
其实题目的意思就是,给出一些单词,给这些单词编个号,然后要求其他的单词中是这个单词后缀的词都在这个词的前面。每个单词的贡献是当前单词的标号减去他的后缀中标号最大的那个的标号。
希望我能表达明白吧233
思路
因为后缀不好考虑,所以先把字符串倒过来,就都变成了前缀
然后把这些字符串在全都挂到trie树上,每个字符串的结尾打的标记是这个字符串的标号。
删去trie树中的虚点(没有打标记的点)。就可以得到一棵新的树,然后发现,每个字符串的前缀肯定都是他的祖先。然后要求给这些节点编号,是的每个节点的祖先的编号都比这个节点的编号小。并且使得所有节点的编号与他父亲的编号的差值和最小。
用贪心的思想,先给子树大小最小的那棵子树编号。显然这样贪心是对的。
代码
/*
* @Author: wxyww
* @Date: 2018-12-17 11:02:04
* @Last Modified time: 2018-12-17 16:59:58
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long ll;
const int N = 110000;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
vector<int>e[N];
int trie[N * 5][30];
char s[N * 5];
int siz[N * 5],tot,bz[N * 5];
void insert(int k) {
int len = strlen(s + 1);
int now = 0;
for(int i = len;i >= 1;--i) {
if(!trie[now][s[i] - 'a']) trie[now][s[i] - 'a'] = ++tot;
now = trie[now][s[i] - 'a'];
}
bz[now] = k;
}
void dfs1(int u,int fa) {
if(bz[u]) e[fa].push_back(bz[u]);
for(int i = 0;i < 26;++i) {
if(!trie[u][i]) continue;
if(bz[u]) dfs1(trie[u][i],bz[u]);
else dfs1(trie[u][i],fa);
}
}
bool cmp(int x,int y) {
return siz[x] < siz[y];
}
void dfs2(int u) {
int k = e[u].size();
siz[u] = 1;
for(int i = 0;i < k;++i) {
int v = e[u][i];
dfs2(v);
siz[u] += siz[v];
}
sort(e[u].begin(),e[u].end(),cmp);
}
int now,bh[N];
ll ans;
void solve(int u,int fa) {
ans += now - fa;fa = now ++;
int k = e[u].size();
for(int i = 0;i < k;++i) {
int v = e[u][i];
solve(v,fa);
}
}
int main() {
int n = read();
for(int i = 1;i <= n;++i) {
scanf("%s",s + 1);
insert(i);
}
dfs1(0,0);
dfs2(0);
solve(0,0);
cout<<ans;
return 0;
}
一言
书足以记名姓而已。剑一人敌,不足学,学万人敌。
[luogu3294][背单词]的更多相关文章
- 做中学(Learning by Doing)之背单词-扇贝网推荐
做中学(Learning by Doing)之背单词-扇贝网推荐 看完杨贵福老师(博客,知乎专栏,豆瓣)的「继续背单词,8个月过去了」,我就有写这篇文章的冲动了,杨老师说: 有时候我会感觉非常后悔,如 ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...
- BZOJ4567[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...
- 《我爱背单词》 Alpha版 发布说明
——发布地址(baidu网盘) http://pan.baidu.com/s/15omtB ——简介 <我爱背单词>是一款英语单词记忆和管理辅助软件,旨在帮助广大考生在短期内攻克GRE. ...
- [No000057]一个人默默背单词,小心被传染哦
不日凛冬将至,全国各地,已有多名少侠因季节变化,出现了不同程度的四肢不勤.bd不分的症状.具体表现为—— 包大人在此高能预警:不想背单词,有可能你已经被传染了. 好好的,怎么突然不想背单词了 哈佛医学 ...
- [No000014]听说不背单词,考英语会是这种下场-我们为什么必须背单词?
由于英语对于一个程序员来说,重要性你懂得.因此我会开始逐渐在博客上加入英语的一些东西. 听说不背单词,考英语会是这种下场 在中国, 「学英语」大抵遵循着这样一条 罗蒙诺索夫质量守恒定律 因为英语学着学 ...
- Supermemo背单词7周年纪念
从2007年2月1日开始,用Supermemo背单词7周年了,在2013年11月21日将单词表Reset,重新开始Review以前背过的单词,并慢慢加入听写VOA时遇到的生词.
- 使用Excel背单词-高效-简单
背单词是一个很纠结的事,想必那些走在留学路上的很多人都被英语这一关卡住了,这里,笔者就聊聊,不讲背单词的方法,只提供使用vb开发的产品和使用方法,有问题欢迎讨论. 简介:使用excel背单词,有一些人 ...
- 基于百词斩和扇贝单词的背单词APP软件测试
概述 背单词APP是非常受大学生青睐的手机应用,但它的发展尚未成熟,存在一些缺陷.我们决定深入地分析一组典型的背单词APP:百词斩(A产品).扇贝单词(B产品),寻找当前背单词APP中的提升空间.下面 ...
随机推荐
- SQL Server 2014备份维护计划
1. 数据库 -> [管理]-> [维护计划] -> [新建维护计划](如果没有操作过可以,选择“维护计划向导”): 2. 直接点击下一步,然后填写计划名称.说 ...
- Dart语法基础
hello world // Define a function. printNumber(num aNumber) { print('The number is $aNumber.'); // Pr ...
- NOIP2015提高组复赛B 子串
题目链接:https://ac.nowcoder.com/acm/contest/263/B 题目大意: 略 分析: 设preA(i)为字符串A中第1个字符到第i个字符构成的字符串. 设preB(i) ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
今天服务器遇到了一个很熟悉的问题, 输入 #mysql -u root -p ERROR 2002 (HY000):Can't connect to local MySQL server ...
- spring 启动脚本分析
参考:JVM 参数使用总结 参考:java -Xms -Xmx -XX:PermSize -XX:MaxPermSize 参考:JVM调优总结 -Xms -Xmx -Xmn -Xss 参考:JAVA ...
- NLP的原理,框架及具体实例
1. 什么是NLP 所谓NLP就是自然语言处理,即计算机识别人的自然沟通语言,将人的语言转换成表达含义相同的文字.因为NLP的目的是将人和计算机通过自然语言沟通成为可能,而人最方便的沟通是通过语音发声 ...
- 莫烦theano学习自修第九天【过拟合问题与正规化】
如下图所示(回归的过拟合问题):如果机器学习得到的回归为下图中的直线则是比较好的结果,但是如果进一步控制减少误差,导致机器学习到了下图中的曲线,则100%正确的学习了训练数据,看似较好,但是如果换成另 ...
- Python——Flask框架——Web表单
一.框架Flask-WTF 安装: pip install flask-wtf 需要程序设置一个密钥 app = Flask(__name__) app.config['SECRET_KEY'] = ...
- How to create DMG on macOS
hdiutil create -srcfolder /users/test1/ -volname test1 /users/test/test1.dmg
- window.onpopstate
概述 window.onpopstate是popstate事件在window对象上的事件句柄. 每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发. 如果当 ...