BZOJ 3439 Kpm的MC密码
倒着建trie,然后主席树来求子树第k大。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 300500
using namespace std;
int n,trie[maxn][],fath[maxn],cnt=,tag[maxn],k,rot,kr,dfn[maxn],mx[maxn],times=,line[maxn];
int tot=,ls[maxn<<],rs[maxn<<],sum[maxn<<];
char s[maxn];
vector <int> v[maxn],root[maxn];
void insert(int father,int &now,int l,int x)
{
if (!now) {now=++cnt;fath[now]=father;}
if (!l) {tag[x]=now;v[now].push_back(x);return;}
insert(now,trie[now][s[l-]-'a'+],l-,x);
}
void build(int &now,int left,int right)
{
now=++tot;
if (left==right) return;
int mid=left+right>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
}
void modify(int last,int &now,int left,int right,int pos)
{
now=++tot;sum[now]=sum[last]+;
if (left==right) return;
int mid=left+right>>;
ls[now]=ls[last];rs[now]=rs[last];
if (pos<=mid) modify(ls[last],ls[now],left,mid,pos);
else modify(rs[last],rs[now],mid+,right,pos);
}
int ask(int last,int now,int left,int right,int x)
{
if (sum[now]-sum[last]<x) return -;
if (left==right) return left;
int mid=left+right>>,lsum=sum[ls[now]]-sum[ls[last]];
if (x<=lsum) return ask(ls[last],ls[now],left,mid,x);
else return ask(rs[last],rs[now],mid+,right,x-lsum);
}
void dfs(int now)
{
dfn[now]=mx[now]=++times;line[times]=now;
for (int i=;i<=;i++)
{
if (trie[now][i])
{
dfs(trie[now][i]);
mx[now]=max(mx[now],mx[trie[now][i]]);
}
}
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%s",s);
insert(,rot,strlen(s),i);
}
dfs(rot);
build(kr,,n);root[].push_back();
for (int i=;i<=times;i++)
{
int now=line[i];
if (!v[now].size()) root[i].push_back(root[i-][root[i-].size()-]);
else
{
root[i].push_back(tot+);modify(root[i-][root[i-].size()-],kr,,n,v[now][]);
for (int j=;j<v[now].size();j++)
{
root[i].push_back(tot+);
modify(root[i][j-],kr,,n,v[now][j]);
}
}
}
for (int i=;i<=n;i++)
{
scanf("%d",&k);
int ret=tag[i];
printf("%d\n",ask(root[dfn[ret]-][root[dfn[ret]-].size()-],root[mx[ret]][root[mx[ret]].size()-],,n,k));
}
return ;
}
BZOJ 3439 Kpm的MC密码的更多相关文章
- BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )
把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...
- bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...
- bzoj 3439: Kpm的MC密码 Trie+动态开点线段树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3439 题解: 首先我们发现这道题要查的是后缀不是前缀. 如果查前缀就可以迅速查找到字符串 ...
- BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)
题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...
- BZOJ 3439 Kpm的MC密码 (Trie树+线段树合并)
题面 先把每个串反着插进$Trie$树 每个节点的子树内,可能有一些节点是某些字符串的开头 每个节点挂一棵权值线段树,记录这些节点对应的原来字符串的编号 查询的时候在线段树上二分即可 为了节省空间,使 ...
- 【BZOJ】【3439】Kpm的MC密码
Trie树/可持久化线段树 神题啊……搞了我一下午= =(其实第233个提交也是我的) 我一开始的思路:这个找kpm串的过程,其实就跟在AC自动机上沿fail倒着往下走是差不多的(看当前是哪些点的后缀 ...
- 【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)
3439: Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记 ...
- BZOJ3439: Kpm的MC密码
3439: Kpm的MC密码 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 166 Solved: 79[Submit][Status] Descr ...
- 【BZOJ3439】Kpm的MC密码 Trie树+可持久化线段树
[BZOJ3439]Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当 ...
随机推荐
- C#抓包
抓包過程中發現頁面<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" v ...
- Shell基础:Linux权限管理
Linux权限基本概念 查看系统(文件夹/文件)权限: ls -l =>d/- xxx xxx xxx. num owner group size date filename ...
- 安装SQL Server 2014
一:下载SQL SERVER 2014 https://www.microsoft.com/zh-cn/server-cloud/products/sql-server-editions/sql-se ...
- hdu---------(1026)Ignatius and the Princess I(bfs+dfs)
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- ARM字节对齐问题详解
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...
- C#中DateTime应用
编写一个控制台程序,输入一个日期,求下一天的日期. 要求如下:在控制台输入一个日期(分别输入年.月.日),判断输入的日期是否有效,如果有效,计算该日期的下一天日期,并显示:否则,输出"无效的 ...
- 转 数据库中的 date datetime timestamp的区别
转 数据库中的 date datetime timestamp的区别 DATETIME, DATE和TIMESTAMP类型是相关的.本文描述他们的特征,他们是如何类似的而又不同的. DATETIME类 ...
- python中数据的变量和字符串的常用使用方法
1.查看变量类型: a=2 print(a,type(a)) print的用法:在print后面跟多个输出,可以用逗号分隔. 回收变量名,如把a存储不同的数据,你不需要删除原有变量就可以直接赋值 2. ...
- iOS开发错误日志
错误提示:fatal error: file '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platfor ...
- 闲聊CSS之关于clearfix--清除浮动[转]
.clearfix:after { content: " "; display: block; clear: both; height:; } .clearfix { zoom:; ...