Luogu P3294 【[SCOI2016]背单词】
阅读理解题
。。。。。。
$Trie$
后缀问题不好处理,我们把它转化为前缀问题,用字典树解决问题
贪心
容易想到,一个串的后缀要先于它插入
对于一个串和其若干后缀串,容易想到,我们要先插入后缀串
然后递归进入$size$最小的子串
bool cmp(const int &x,const int &y)
{
return size[x]<size[y];
}
void makes(int x)
{
size[x]=;
for(int i=;i<t[x].size();i++)
{
makes(t[x][i]);
size[x]+=size[t[x][i]];
}
sort(t[x].begin(),t[x].end(),cmp);
}
void dfs(int x)
{
id[x]=tot++;
for(int i=;i<t[x].size();i++)
{
ans+=tot-id[x];
dfs(t[x][i]);
}
}
注意
求$size$要重构树,只保留关键点
因为我太蒻了,并不会指针,所以提供一个并查集重构树的方法
在建$Trie$时给所有串的结尾和$Trie$树的根节点标号,表示新树中点的编号
void insert(const string &s,int id)
{
int now=,l=len[id];
for(int i=;i<l;i++)
{
int c=idx(s[i]);
now=tr[now][c]?tr[now][c]:tr[now][c]=++cnt;
}
val[now]=id;
}
然后遍历$Trie$树,如果一个节点的子节点没有被标号,就把它并入当前节点的集合;否则把这个子节点作为当前节点所在集合的根的儿子(就是连一条边)
void make(int x)
{
for(int v,i=;i<;i++)
if(v=tr[x][i])
{
if(!val[v])
f[v]=find(x);
else
t[val[find(x)]].push_back(val[v]);
make(v);
}
}
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
const int maxl=,maxn=1e5+;
int n,tr[maxl][],val[maxl],cnt,len[maxn],size[maxn],tot,f[maxl],id[maxn],ans;
vector<int>t[maxn];
string st[maxn];
inline int find(int x)
{
return x==f[x]?x:f[x]=find(f[x]);
}
inline int idx(char c)
{
return c-'a';
}
void insert(const string &s,int id)
{
int now=,l=len[id];
for(int i=;i<l;i++)
{
int c=idx(s[i]);
now=tr[now][c]?tr[now][c]:tr[now][c]=++cnt;
}
val[now]=id;
}
void make(int x)
{
for(int v,i=;i<;i++)
if(v=tr[x][i])
{
if(!val[v])
f[v]=find(x);
else
t[val[find(x)]].push_back(val[v]);
make(v);
}
}
bool cmp(const int &x,const int &y)
{
return size[x]<size[y];
}
void makes(int x)
{
size[x]=;
for(int i=;i<t[x].size();i++)
{
makes(t[x][i]);
size[x]+=size[t[x][i]];
}
sort(t[x].begin(),t[x].end(),cmp);
}
void dfs(int x)
{
id[x]=tot++;
for(int i=;i<t[x].size();i++)
{
ans+=tot-id[x];
dfs(t[x][i]);
}
}
signed main()
{
scanf("%lld",&n);
for(int i=;i<=n;i++)
{
cin>>st[i];
len[i]=st[i].length();
for(int j=;j<len[i]/;j++)
swap(st[i][j],st[i][len[i]-j-]);
insert(st[i],i);
}
for(int i=;i<=cnt;i++)
f[i]=i;
make(),makes(),dfs();
printf("%lld\n",ans);
return ;
}
Luogu P3294 【[SCOI2016]背单词】的更多相关文章
- [luogu] P3294 [SCOI2016]背单词 (贪心)
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,"我怎么样才能快点学完,然后去玩三国杀呢?".这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他 ...
- P3294 [SCOI2016]背单词
P3294 [SCOI2016]背单词 Trie+贪心 倒插进树+取出重建+子树处理+贪心遍历 倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中 取出重建:重新建立一棵以单词为节点的树,如果 ...
- 洛谷P3294 [SCOI2016]背单词——题解
题目传送 阅读理解题题意解释可以看这位大佬的博客. 发现求后缀与倒序求前缀是等价的,而找前缀自然就想到了trie树.将所有字符串翻转后再建入trie树中,再对每一个字符串翻转后从trie树中找前缀,就 ...
- BZOJ4567[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...
- 4567: [Scoi2016]背单词
4567: [Scoi2016]背单词 https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题意: 题意看了好久,最后在其他人的博客里看懂了的. ...
- 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心
[BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
- 【bzoj4567】[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][ ...
- [SCOI2016]背单词 题解
背单词 https://www.luogu.com.cn/problem/P3294 前言: Trie树的省选题(瑟瑟发抖QAQ) 问题汇总:(请忽略) (1)对Trie字典树的运用不熟练 (2)没想 ...
- [SCOI2016]背单词——trie树相关
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...
随机推荐
- CodeForces842C 树上dfs
http://codeforces.com/problemset/problem/842/C 题意: 有一个n个节点的数,每个点有一个点权,根到这个点的所有点权(包括这个点和根)的gcd值为这个点的答 ...
- ElasticSearch 批量增加索引
服务端批量增加索引,版本是5.1.1 TransportClient client; Settings esSettings = Settings.builder() .put("clust ...
- js中闭包的概念和用法
闭包:主要的作用是 封装变量,收敛权限.防止变量被污染.比如Jquery框架就运用了大量的闭包.为什么呢? 问个问题?框架是如何来避免你声明的变量和它自带的变量不发生的冲突的?????很明显,需要闭包 ...
- 原生js轮播图实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- google Guava包的ListenableFuture解析
一. ListenableFuture是用来增强Future的功能的. 我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果.如果我们希望一旦计算完成就拿到结果展示给用户或者做另外 ...
- FZU - 1989 AntiAC
Problem 1989 AntiAC Accept: 93 Submit: 444Time Limit: 4000 mSec Memory Limit : 32768 KB Prob ...
- Neural Networks and Deep Learning(week4)Deep Neural Network - Application(图像分类)
Deep Neural Network for Image Classification: Application 预先实现的代码,保存在本地 dnn_app_utils_v3.py import n ...
- Python写日志
import logging import ResultFolder logger = logging.getLogger() logger.setLevel(logging.DEBUG) def C ...
- python自带的调试器
python是自带调试器的. 比如你写了一个python程序,名叫test.py. 你想调试一下这个程序,你可以执行 python -m pdb test.py,就会进入test.py的调试. 想查看 ...
- 第一节 简单的jsp实例
1.打开Eclipse,依次点击“File” .“New” .“Other” ,选择生成动态Web项目. 2.输入项目名字,点击Finish 生成项目结构如下: 3.在WebContent目录上,单击 ...