#2652. 背单词(word)

题目描述

Lweb 面对如山的英语单词,陷入了深深的沉思,「我怎么样才能快点学完,然后去玩三国杀呢?」。这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n n n 个,现在我们从上往下完成计划表,对于一个序号为 x x x 的单词(序号 1 ∼ x − 1 1 \sim x-1 1x1 都已经被填入):

  • 如果存在一个单词是它的后缀,并且当前没有被填入表内,那他需要吃 n × n n \times n n×n 颗泡椒才能学会;
  • 当它的所有后缀都被填入表内的情况下,如果在 1 ∼ x − 1 1 \sim x-1 1x1 的位置上的单词都不是它的后缀,那么他吃 x x x 颗泡椒就能记住它;
  • 当它的所有后缀都被填入表内的情况下,如果 1 ∼ x − 1 1 \sim x-1 1x1 的位置上存在是它后缀的单词,所有是它后缀的单词中,序号最大为 y y y ,那么他只要吃 x − y x-y xy 颗泡椒就能把它记住。

Lweb 是一个吃到辣辣的东西会暴走的奇怪小朋友,所以请你帮助 Lweb,寻找一种最优的填写单词方案,使得他记住这 n n n 个单词的情况下,吃最少的泡椒。

数据范围

1 ≤ n ≤ 100000 1 \le n \le 100000 1n100000 , 所有字符的长度总和 1 ≤ ∣ l e n ∣ ≤ 510000 1 \le |len| \le 510000 1len510000

题解

好冗长难懂的题目qwq

考虑反串建立 t r i e trie trie ,将结束位置标为关键点,将关键点拉出构成一个树,可以看出要先取走父亲再取走儿子。

问题就变为对每个点分配权值 a a a 使得 a i ∈ [ 1 , n ] a_i \in [1,n] ai[1,n] a i > a f a i a_i>a_{fa_i} ai>afai ∑ a i − a f a i \sum a_i-a_{fa_i} aiafai 最小。

可以发现 ∑ a i \sum a_i ai 使一定的,于是考虑 ∑ a f a i \sum a_{fa_i} afai 的贡献最大即可。

考虑一下不同子树大小间的比较,即有两个子树 x , y x,y x,y s i z e x < s i z e y size_x<size_y sizex<sizey ,如果先走 x x x 子树贡献为 A A A ,先走 y y y 子树贡献为 B B B ,所以先走 x x x 子树两个子树的贡献是 A + B + ( s i z e x + 1 ) × s i z e y A+B+(size_x+1) \times size_y A+B+(sizex+1)×sizey ,先走 y y y 子树两个子树的贡献是 A + B + ( s i z e y + 1 ) × s i z e x A+B+(size_y+1) \times size_x A+B+(sizey+1)×sizex ,作差结果为 s i z e y − s i z e x > 0 size_y-size_x>0 sizeysizex>0 ,所以先走小子树更优。

因此从子树小的往下遍历即可。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=5.1e5+5,M=1e5+5;
int n,t[N][26],c,s[N],z[N],v[N],e[M],a[N],hd[N],V[M],nx[M],in[N];
char r[N]; long long ans;
struct O{
	int x,y;
	friend bool operator < (const O& A,const O& B){
		return z[A.x]>z[B.x];
	}
};
priority_queue<O>q;
void add(int u,int v){
	nx[++c]=hd[u];V[hd[u]=c]=v;
}
void dfs(int x,int lt){
	z[x]=s[x];
	if (s[x]) v[lt]++,add(lt,x),lt=x;
	for (int i=0;i<26;i++)
		if (t[x][i]) dfs(t[x][i],lt),z[x]+=z[t[x][i]];
}
int main(){
	cin>>n;
	for (int i=1,l,p;i<=n;i++){
		scanf("%s",r);
		l=strlen(r);p=0;
		for (int v,j=l-1;~j;j--){
			v=r[j]-97;
			if (!t[p][v])
				t[p][v]=++c;
			p=t[p][v];
		}
		s[e[i]=p]=1;
	}
	c=0;dfs(0,0);
	for (int i=hd[0];i;i=nx[i])
		q.push((O){V[i],v[V[i]]});
	int i=0;
	while(!q.empty()){
		O x=q.top();q.pop();i++;
		ans+=1ll*(1-x.y)*i;
		for (int i=hd[x.x];i;i=nx[i])
			q.push((O){V[i],v[V[i]]});
	}
	cout<<ans<<endl;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2010考研单词象形记忆法,共解释了6715个单词和词组,让再也不要记单词,举例如下: unit uni、un【one一:u像杯子-引申为空间,n像门-引申为连接,i像一个小点→在一个空间里连接成一点】,t【固定】 →一个固定的:部件、单元 《黑体的部分是这个单词的中文意思,下面相同》、《“】”右边的第一个尖头“→”起到“冒号”的作用》 name n【门-连接】,a【元音字母“a、e、i、o、u、y”和“元音字母组合”很多情况下都是表达一个单词的声音,就像汉字形声字的声旁,可以没有含义,可以不解释】,m【移动-跟随】,e【辅音字母+e结尾,表明前面的声旁发开口音,以辅音字母结尾的则发闭口音,请大家记住这个规律】 →一个人生出来,就有一个东西与他相连接、一生都跟着他走的是名字、取名→说出、指出、名义 I I【顶天立地】为我 me m【山】,e【看】→顶天立地的我,看起来如山 my m【山】,y【分叉-路】 →此山此路皆是我的 “此山是我买,此路是我开,要打次路过,留下买路钱。” self se【=see看:s伸缩,ee眼睛→眼球伸缩调节焦距才能看见】,l【手臂】,f【手】→看看自己的手臂,又看看自己的手,哦,这才明白,这都是自己、自我、本人 selves self的复数,f=v:f和v是经常互换的 《大家注意:辅音字母之间的替换是由于两个字母之间的发音太相近了,以致于听错而造成的;另一个替换的原因是两个字母的书写形式太相像了以致于造成书写上的错误;这两种原因都叫“通假”,“通假”在汉字里也是常见的。下面的解释里,会多出看到通假的情况》 myself my【我】+self【自己】=我自己、我亲自 mine m【山】,in【在里面:i我,n门→我在门里面】,e【出】 →山里产出的:矿、矿山→我的(矿山)、我的东西 you y【分叉-分裂】,ou【表示读音,因为这是一个形声字】→从我分裂出来的是你、你们 your you【你】+r【走】→是你的,你就可以带走;不是你的,请不要动。 yours your【你的、你们的】+s【东西】→你的东西、你们的东西 yourself your【你的】+self【自己】→你自己 yourselves your【你的、你们的】+selves【自己】→你们自己 he H【梯子-高处-高大】,e【看】→男人看起来总是比女人高大,所以he指男性的他 him hi【=he他:这里i=e,元音字母之间的替换比辅音字母的替换更常见,目的是在不改变词意的情况下改变读音,因为同一个字在不同的方言里有不同的发音,当一种方言引进其他方言的语言时,保留了这种发音上的区别。区别:元音的替换是有意为之,辅音的替换则是错误造成】,m【移动-作客】→他移动去作宾客,所以是宾格的他 his hi【=he他】,s【女人】→这个女人是他的 she s【女人】,he【他】→女人总是依靠在男人身边,所以she是女性的她 her he【他】,r【围绕】→女人是附庸,总是围绕着男人转,所以围绕着他转的是宾格的她,他是她的中心 《注意:现在说明一个最重要的规律:绝大多数的单词的核心意思在于他的第一个字母或第一个辅音字母组合,而后面的字母则是对第一个字母的核心意义的详加解释;少数单词的核心意义不再第一个字母上,则是由于历史原因,或者发音的不便,或者字母象形意义实在不好放在第一个字母上而做出的调整。比如以上几个人称代词中,以h开头的都是表示男性,而her表示女性则是由于把r放在he的前面“rhe”,这不便于发音,故而把r调到了后面。》 it i【点】,t【钉-站立】 →it表示物体的它,物体总是站在一个点上,不会主动的动,动物虽然会自己动,但是它们没有思想,不能跟人相提并论,所以it也用来指代动物 we w【对称】,e【看】→一边一个人,看起来就是对称的两个人,所以we指我们两个人 us u【容器-空间】,s【伸缩的舌头-说话】 →去作客的时候,会有很多人,所以我们会聚在一个空间里说话,所以us指宾格的我们 our o【圈子-圈住所有的东西】,u【空间】,r【围绕】 →圈住、围绕住空间里所有的东西,所以这些东西都是我们的 they th【=t延伸】,e【向外】,y【分裂】→I是我,从I分裂出you你,再从你向外延伸分裂出他们、她们、它们 them the【=they他们:英语造字的一个重要法则就是省略,即把一个旧单词截头或结尾,然后加上别的字母或截短的单词而成新字】,m【移动-作客】 →他们都移动出去作客,所以them是宾格的他们、她们、它们 their thei【=they他们,元音字母主要起表音作用,所以可以随意变换】,r【走】→是他们的东

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值