首页 > 其他分享 >LOJ #2012. 「SCOI2016」背单词

LOJ #2012. 「SCOI2016」背单词

时间:2022-10-25 11:36:27浏览次数:86  
标签:rt fr ch last LOJ siz int SCOI2016 背单词


题目链接:​​传送门​

显然第一个情况和第二个情况不如第三个更优
并且他们可以避免,所以尽量构造第三种情况
将每个字符倒着插入trie树,因为先放后面的字符串是更优的
然后通过以字符结尾的点重构一棵树
在遍历这棵树的时候先走siz小的儿子一定更优,统计答案即可

#include <bits/stdc++.h>
#define

using namespace std;
typedef long long ll;
int ch[A][26], n, ed[A], cnt, siz[A], ct; ll ans;
char s[A];
void insert(char *s) {
int len = strlen(s), rt = 0;
for (int i = len - 1; i >= 0; i--) {
int x = s[i] - 'a';
if (!ch[rt][x]) ch[rt][x] = ++cnt;
rt = ch[rt][x];
}
ed[rt] = 1;
}
vector<int> g[A];
void prepare(int fr, int last) {
if (ed[fr]) g[last].push_back(fr), last = fr;
for (int i = 0; i < 26; i++) if (ch[fr][i]) prepare(ch[fr][i], last);
}
void dfs(int fr) {
siz[fr] = 1;
for (int i = 0; i < g[fr].size(); i++) {
int ca = g[fr][i];
dfs(ca); siz[fr] += siz[ca];
}
}
void work(int fr, int last) {
int tim = ct++;
ans += tim - last;
sort(g[fr].begin(), g[fr].end(), [](int x, int y) {return siz[x] < siz[y];});
for (int i = 0; i < g[fr].size(); i++) {
int ca = g[fr][i];
work(ca, tim);
}
}

int main(int argc, char const *argv[]) {
cin >> n;
for (int i = 1; i <= n; i++) scanf("%s", s), insert(s);
prepare(0, 0); dfs(0); work(0, 0);
cout << ans << endl;
}


标签:rt,fr,ch,last,LOJ,siz,int,SCOI2016,背单词
From: https://blog.51cto.com/lyle/5794329

相关文章

  • LOJ #6208. 树上询问
    题目链接:​​传送门​​线段树维护每个点的k,t,d当做懒标记来维护这就需要对懒标记的理解了#include<bits/stdc++.h>#defineusingnamespacestd;typedeflonglongll;......
  • LOJ #6220. sum
    题目链接:​​传送门​​官方题解:有一个结论:必有连续的一串数和为n的倍数证明:先求个前缀和若这个前缀和中有的倍数,则这个前缀即为答案若这个前缀和中没有的倍数,即模余~......
  • LOJ #10202. 「一本通 6.2 练习 5」樱花
    题目链接:​​传送门​​​​别人的题解​​​不想写那么多latex了化完式子之后就是求的约数个数#include<bits/stdc++.h>#defineusingnamespacestd;typedeflonglong......
  • loj3053
    引言它还是来了。这题我尝试写过一次,寄了。然后开摆了。现在决定重新补一补这题。敬请收看:myee调长剖调到CSP还没有调出来的惨状!欢迎来看我什么时候补掉。当然也可......
  • loj3885. 「eJOI2022」Bounded Spanning Tree
    草稿:非树边\(u,v,[l,r]\)把\(u,v\)路径上所有边上界与\(r-1\)取个\(\min\)。剩下的边左端点排序后贪心,每次取右端点最小的一个元素。开始只考虑树边。当前加入一......
  • LOJ #2351. 「JOI 2018 Final」毒蛇越狱
    题面传送门奇妙的看上去不能过的题目。首先有一个非常sb的暴力,大概就是枚举?的子集,然后统计,时间复杂度\(O(2^{cnt_1})\)单次。直接算没有优化空间,考虑子集容斥,先FWT预处......
  • [loj2846]量子隐形传态
    假设当前位于$A(x,y)$,将坐标系按上下左右、(左/右)(上/下)分为八块引理:存在一组最优解,每次均移动到某一块中距离$(x,y)$最近的某点记$d(A,B)$为$A$到$B$的切比雪夫距离,......
  • Macrobrew: Clojure macros distilled
    原文地址:https://www.abhinavomprakash.com/posts/macrobrew/Macrobrew:ClojuremacrosdistilledNovember10,2021·23min·AbhinavOmprakashIfirstreadabo......
  • 简单的clojure下socket server编程
    一、概述本文是简单的clojure下SocketServer编程,所谓的简单是:收发都是string,可以通过函数启动和关闭Server。所用的库为:aleph,项目地址:https://github.com/clj-commons/a......
  • LOJ 分块入门 1~9
    LOJ数列分块\(1\sim9\)T1区间加,单点查。没啥好说的,分块都不想写。树状数组+差分解决。#include<bits/stdc++.h>#definemem(a,b)memset(a,b,sizeofa)#define......