[Scoi2016]背单词[字典树+dfs重构树[类似虚树]]
解题思路:很明显第一个条件是可以避免的,第二个条件是第三个条件的特殊情况,所以有用的只有第三个条件,现在我们就是想将这些单词重排使得每个单词后缀都在这个单词的前面并且代价最小
我们举个例子:
6
a
ca
ea
gda
hda
ifb
很明显我们发现很多点是没有用的我们为了计算其实可以直接提出红色的点
我们可以举几个例子,发现先跑子树小的明显最优
#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <limits.h>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define hash Hash
#define next Next
#define pb push_back
#define f first
#define s second
using namespace std;
const int N = 1e5 + 10, mod = 1e9 + 9;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}
int n, idx, cnt;
int tr[N * 31][30];
char a[N * 6];
int tag[N * 31];
vector<int> g[N * 6];
int siz[N * 6];
void insert(char *a)
{int rt = 0;int len = strlen(a);for(int i = len - 1; i >= 0; -- i){if(!tr[rt][a[i] - 'a']) tr[rt][a[i] - 'a'] = ++ idx;rt = tr[rt][a[i] - 'a'];}tag[rt] = 1;
}void build(int rt,int last)//last是上一个红点编号是啥
{if(tag[rt] && rt){g[last].pb(rt);last = rt;}for(int i = 0; i < 26; ++ i)if(tr[rt][i])build(tr[rt][i],last);
}bool cmp(int x, int y)
{return siz[x] < siz[y];
}void dfs(int u)//按照子树大小排序
{siz[u] = 1;for(auto it : g[u]){dfs(it);siz[u] += siz[it];}sort(g[u].begin(),g[u].end(),cmp);
}
ll ans = 0;
void getans(int x)
{int dfn = cnt ++;for(auto it : g[x]){ans += cnt - dfn; getans(it);}
}int main()
{read(n);for(int i = 0; i < n; ++ i){scanf("%s",a);insert(a);}tag[0] = 1;build(0,0);dfs(0);getans(0);cout << ans << endl;return 0;
}
[Scoi2016]背单词[字典树+dfs重构树[类似虚树]]相关推荐
- bzoj3252攻略(线段树+dfs序)或者(树链剖分+dfs)
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1341 Solved: 642 [Submit][Status][Discuss] ...
- 【bzoj4567】[Scoi2016]背单词 贪心+trie树
我个傻逼,这么水的题还调了那么久. 把所有的串都反过来,建trie树,很明显,不同子树间是不影响的. 一定是先选择父亲节点再选子节点,同一个节点先选子树大小最小的儿子即可. 一开始想错了,以为可以直接 ...
- BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Tr ...
- BZOJ4567 SCOI2016背单词(trie+贪心)
倒过来变成查询前缀.考虑怎么排序.第一条代价n*n就相当于inf,说明一个单词的所有前缀都要排在它前面.那么串的依赖关系就是trie的结构.二三条说明代价是Σidi-idfa,那么显然最后的编号应该是 ...
- 【IOI2018】狼人【Kruscal重构树】【主席树】
题意:nnn个点mmm条边的无向图,qqq次询问,每次给定s,t,L,Rs,t,L,Rs,t,L,R,判断是否存在一条sss到ttt的路径,使得路径上可以找到一点kkk,满足此路径s∼ks\sim k ...
- 牛客练习赛71 F 红蓝图(kruskal重构树)
红蓝图 给定两个参数x,tx, tx,t,删除边权大于ttt的红边,和边权小于ttt的蓝边,问对于所有的点yyy,既能通过红边走向xxx,又能通过蓝边走向xxx,的点有多少个. 考虑对红边按照边权升序 ...
- BZOJ2286: [Sdoi2011]消耗战(虚树)
BZOJ2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MB Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成, ...
- 浅谈虚树(虚仙人掌)
虚树是什么? 在 OI 比赛中,有这样一类题目:给定一棵树,另有多次询问,每个询问给定一些关键点,需要求这些关键点之间的某些信息.询问数可能很多,但满足所有询问中关键点数量的总和比较小. 由于询问数可 ...
- 洛谷_2495 [SDOI2011]消耗战(虚树)
消耗战 题目链接:https://www.luogu.com.cn/problem/P2495 题解: 对于单样例,可以考虑树形DP. 但此题是多实例,所以需要对树进行处理,每次询问有k+1(加上一号 ...
最新文章
- Flutter 拨打电话和跳转网页
- 谷歌的硬件梦:Pixel手机、ChromeOS平板和Home音箱
- VMware Horizon7的部署(接上期校园网络建设)《二》
- RabbitMQ Node.js 示例
- 贪心 Codeforces Round #191 (Div. 2) A. Flipping Game
- golang数据类型与MySQL数据类型的对应
- 【杂谈】如何学会看arxiv.org才能不错过自己研究领域的最新论文?
- flash开发中如何实现界面代码分离
- JS 与Flex交互:html中的js 与flex中的actionScript通信
- 我这几年呆的这几个公司
- ckrule规则编辑器在wpf中的使用
- document.execCommand
- 小程序内嵌H5页面判断微信及小程序环境
- 使用Visual Studio 2013编写Windows程序
- 局域网打印机共享怎么设置_局域网共享精灵 局域网内便节共享文件和打印机...
- Python 学习资源大全中文版
- python计算相关性系数
- IPad分屏,当电脑第二显示屏
- cad图片怎么转换成pdf格式
- 微信公众号与小程序数据互通