「SCOI2016」背单词 解题报告
「SCOI2016」背单词
出题人sb
题意有毒
大概是告诉你,你给一堆n个单词安排顺序
如果当前位置为x
当前单词的后缀没在这堆单词出现过,代价x
这里的后缀是原意,但不算自己,举个例子比如abc的后缀是bc和c
否则
如果它的后缀(指在n个单词中的)在1~x-1全部出现了,代价为x-最后一个后缀的位置y
如果没有全部出现,代价n^2
看我气的连latex都懒得用了
然后你发现按后缀建字典树就可以了
然后你发现直接按子树大小贪心就可以了
但是我一开始偷懒就直接在trie上贪心走子树,这样是不行的,大小是错误的
得把关键点树建出来做
Code:
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define ll long long
const int N=6e5+10;
std::vector <int> Edge[N];
char s[N];
int ch[N][26],endro[N],tot;
int n,clock=-1,siz[N];
ll ans;
void ins()
{
scanf("%s",s+1);
int now=0,len=strlen(s+1);
for(int i=len;i;i--)
{
int c=s[i]-'a';
if(!ch[now][c]) ch[now][c]=++tot;
now=ch[now][c];
}
endro[now]=1;
}
void dfs0(int now,int anc)
{
if(endro[now]) Edge[anc].push_back(now),anc=now;
for(int i=0;i<26;i++)
if(ch[now][i])
dfs0(ch[now][i],anc);
}
void dfs(int now)
{
siz[now]=1;
for(int i=0;i<Edge[now].size();i++)
dfs(Edge[now][i]),siz[now]+=siz[Edge[now][i]];
}
bool cmp(int x,int y){return siz[x]<siz[y];}
void dfs(int now,int las)
{
int tim=++clock;
ans=ans+tim-las;
std::sort(Edge[now].begin(),Edge[now].end(),cmp);
for(int i=0;i<Edge[now].size();i++)
dfs(Edge[now][i],tim);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) ins();
dfs0(0,0);
dfs(0);
dfs(0,0);
printf("%lld\n",ans);
return 0;
}
2019.3.4
「SCOI2016」背单词 解题报告的更多相关文章
- loj#2012. 「SCOI2016」背单词
题目链接 loj#2012. 「SCOI2016」背单词 题解 题面描述有点不清楚. 考虑贪心 type1的花费一定不会是优的,不考虑, 所以先把后缀填进去,对于反串建trie树, 先填父亲再填儿子, ...
- AC日记——「SCOI2016」背单词 LiBreOJ 2012
#2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...
- 「SCOI2016」背单词
「SCOI2016」背单词 Lweb 面对如山的英语单词,陷入了深深的沉思,「我怎么样才能快点学完,然后去玩三国杀呢?」.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,然后 ...
- 【LOJ】#2012. 「SCOI2016」背单词
题解 我们发现第一种操作肯定不可取,每个节点里它最近的点是它最长出现过的后缀,发现这就是AC自动机的fail节点,根据fail的关系这会是一棵树,而一个单词的前一个序号最大的后缀必定是它的父亲 然后我 ...
- loj2012 「SCOI2016」背单词
-- #include <algorithm> #include <iostream> #include <cstring> #include <cstdio ...
- 「FJOI2016」神秘数 解题报告
「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...
- 「ZJOI2016」大森林 解题报告
「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...
- 「NOI2015」寿司晚宴 解题报告
「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...
- 「SCOI2015」国旗计划 解题报告
「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...
随机推荐
- [2017BUAA软工助教]案例分析小结
BUAA案例分析小结 一.作业要求 http://www.cnblogs.com/jiel/p/7631784.html 二.统计数据 总人数 神策数据 博客园博客 必应词典 30 1 12 17 三 ...
- JavaScript实现文字跑马灯
其实实现文字的跑马灯和实现图片轮播的原理是一样的. 下面是我自己实现的,文字的位置可以随便更改,效果不会变,文字的内容可以通过ajax获取,同时,可以直接用Jquery改写一下,很方便. <!D ...
- 学习 yii2.0——视图之间相互包含
布局 首先创建一个布局文件simple.php,路径是在views/layout/目录下. <p>this is header</p> <?= $content ?> ...
- Linux下用rm删除的文件的恢复方法
Linux下用rm删除的文件的恢复方法_Linux教程_Linux公社-Linux系统门户网站https://www.linuxidc.com/Linux/2008-08/14744.htm linu ...
- 网站数据分析&初始来源
数据分析:如何追踪访客初始来源_搜索学院_百度搜索资源平台 https://ziyuan.baidu.com/college/articleinfo?id=260 网站数据分析:如何追踪访客初始来源 ...
- How to Configure Email Notification in Jenkins
How to Configure Email Notification in Jenkins? - The Official 360logica Bloghttps://www.360logica.c ...
- [转帖]SSH 的 三种代理功能.
https://www.zhihu.com/people/skywind3000/activities 之前用过frp 知道 ssh 有一 反向代理的功能 没想到 还有这么多高级功能 收藏一下. ss ...
- zepto的extend
类型判断 var class2type = {},toString = class2type.toString,$={}; //判断类型 function type(obj) { return obj ...
- Kettle中表输出字段和字段选择
表输出: 字段选择: 注:字段选择可以输出匹配后的选中列,表输出则输出匹配后的所有列.
- 引入kaptcha实现验证码验证
1.导入jar包, 可以选择去 https://mvnrepository.com 里面搜索,也可以直接复制下面的代码 2.复制到maven配置文件pom.xml中并保存 <dependency ...