「SCOI2016」背单词

Lweb 面对如山的英语单词,陷入了深深的沉思,「我怎么样才能快点学完,然后去玩三国杀呢?」。这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 $ n $ 个,现在我们从上往下完成计划表,对于一个序号为 $ x $ 的单词(序号 $ 1 \ldots x-1 $ 都已经被填入):
1. 如果存在一个单词是它的后缀,并且当前没有被填入表内,那他需要吃 $ n \times n $ 颗泡椒才能学会;
2. 当它的所有后缀都被填入表内的情况下,如果在 $ 1 \ldots x - 1 $ 的位置上的单词都不是它的后缀,那么他吃 $ x $ 颗泡椒就能记住它;
2. 当它的所有后缀都被填入表内的情况下,如果 $ 1 \ldots x - 1 $ 的位置上存在是它后缀的单词,所有是它后缀的单词中,序号最大为 $ y $,那么他只要吃 $ x - y $ 颗泡椒就能把它记住。
Lweb 是一个吃到辣辣的东西会暴走的奇怪小朋友,所以请你帮助 Lweb,寻找一种最优的填写单词方案,使得他记住这 $ n $ 个单词的情况下,吃最少的泡椒。

Sol
可以发现一定按着树的顺序填比较优(<n*n)
那么首先正的贡献是一定的(1+...+n),只考虑负的贡献。
对于两棵大小不同的子树,记第一颗大小为x,第二棵为y(x<y)
从每一条边考虑贡献。
先1后2
W1=x*(y-1)=xy-x
先2后1
W2=xy-y
W1-W2=y-x>0 先W1更优
 所以把sz按小到大排序就好了。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define maxn 600005
using namespace std;
int n,cnt,tr[maxn][],p[maxn],f[maxn],sz[maxn],sc;
long long ans;
vector<int>G[maxn];
char ch[maxn];
void ins(int id){
int len=strlen(ch);
int k=;
for(int i=len-;i>=;i--){
if(!tr[k][ch[i]-'a'])tr[k][ch[i]-'a']=++cnt;
k=tr[k][ch[i]-'a'];
}
p[k]=id;
}
void lj(int t1,int t2){
f[t1]=t2;G[t2].push_back(t1);
}
void add(int k,int la){
if(p[k])lj(p[k],la);
for(int i=;i<;i++){
if(tr[k][i])add(tr[k][i],p[k]?p[k]:la);
}
if(p[k])sz[la]+=(++sz[p[k]]);
}
bool cmp(int a,int b){return sz[a]<sz[b];}
void dfs(int k,int f){
if(k)ans+=(++sc)-f;
int val=sc;
for(int i=;i<G[k].size();i++){
dfs(G[k][i],val);
}
}
int main(){
cin>>n;
for(int i=;i<=n;i++){
scanf(" %s",ch);ins(i);
}
add(,); for(int i=;i<=n;i++)sort(G[i].begin(),G[i].end(),cmp);
dfs(,);
cout<<ans<<endl;
return ;
}

「SCOI2016」背单词的更多相关文章

  1. 「SCOI2016」背单词 解题报告

    「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...

  2. loj#2012. 「SCOI2016」背单词

    题目链接 loj#2012. 「SCOI2016」背单词 题解 题面描述有点不清楚. 考虑贪心 type1的花费一定不会是优的,不考虑, 所以先把后缀填进去,对于反串建trie树, 先填父亲再填儿子, ...

  3. AC日记——「SCOI2016」背单词 LiBreOJ 2012

    #2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

  4. 【LOJ】#2012. 「SCOI2016」背单词

    题解 我们发现第一种操作肯定不可取,每个节点里它最近的点是它最长出现过的后缀,发现这就是AC自动机的fail节点,根据fail的关系这会是一棵树,而一个单词的前一个序号最大的后缀必定是它的父亲 然后我 ...

  5. loj2012 「SCOI2016」背单词

    -- #include <algorithm> #include <iostream> #include <cstring> #include <cstdio ...

  6. 「SCOI2016」围棋 解题报告

    「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了, ...

  7. 「SCOI2016」妖怪 解题报告

    「SCOI2016」妖怪 玄妙...盲猜一个结论,然后过了,事后一证,然后假了,数据真水 首先要最小化 \[ \max_{i=1}^n (1+k)x_i+(1+\frac{1}{k})y_i \] \ ...

  8. 「SCOI2016」美味 解题报告

    「SCOI2016」美味 状态极差无比,一个锤子题目而已 考虑每次对\(b\)和\(d\)求\(c=d \ xor \ (a+b)\)的最大值,因为异或每一位是独立的,所以我们可以尝试按位贪心. 如果 ...

  9. 「SCOI2016」萌萌哒 解题报告

    「SCOI2016」萌萌哒 这思路厉害啊.. 容易发现有个暴力是并查集 然后我想了半天线段树优化无果 然后正解是倍增优化并查集 有这个思路就简单了,就是开一个并查集代表每个开头\(i\)每个长\(2^ ...

随机推荐

  1. LUOGU P3380 【模板】二逼平衡树(树套树)

    传送门 解题思路 这里写的是常数巨大的线段树套\(splay\),卡了半天常才过.首先线段树每个节点挂一个\(splay\),\(splay\)中的元素即为线段树管辖的区间中的数.对于操作\(1\), ...

  2. vue绑定属性、绑定class及绑定style

    1.绑定属性  v-bind 或者 : 例如:<img :src="pic_src" /> <template> <div id="app& ...

  3. src,href 和rel的区别

    src用于替换当前元素,值一般是引用的文件的绝对路径或者相对路径 href 属性的值可以是任何有效文档的相对或绝对URL,包括片段标识符和JavaScript代码段 rel REL属性用于定义链接的文 ...

  4. python中匿名函数lamada函数的使用说明

    匿名函数lambda是指一类无需定义标识符(函数名 )的一类函数式或子程序.lambda函数可以 接受多个任意参数,并且返回单个表达式的值. 它的意义在于即插即用类型,不必定义名字,方便.它需要的返回 ...

  5. printf ("%*.*s")

    小数点.后“*”表示输出位数,具体的数据来自参数表printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”. 同样,小数点 ...

  6. Hooking EndScene

    Hey guys, umm i was trying to hook endscene using detours and i used a method that i hooked many oth ...

  7. Window随笔 - Windows Server 2012 評估版與延長使用期限【转载】

    Windows Server 2012 評估版與延長使用期限 下載與安裝 至 微軟的評估中心 下載 Windows Server 2012 SP1 180 天軟體試用版 (Windows Server ...

  8. Linux崩溃时启动脚本获取进程相关信息

    编写test.cpp #include <stdlib.h> #include <stdio.h> #include <exception> #include &l ...

  9. 详解JavaScript数组过滤相同元素的5种方法

    详解JavaScript数组过滤相同元素的5种方法:https://www.jb51.net/article/114490.htm

  10. hdu3555 Bomb(数位dp)

    题目传送门 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total ...