题目大意:

  有n个字符串,编号为1~n,求每一个字符串在其他字符串中以它为后缀的字符串中编号第k小的字符串的编号。

思路:

  将字符串倒过来建Trie,记录每个结尾节点的编号(可能会有重复,所以开一个vector记录)。再对trie树进行dfs序,记录结尾节点的子树区间。区间第k小,自然用可持久化线段树(由于权值就是id,所以不用离散化)。 注意:dfs序在遇到结尾节点时才++记录序号的变量cnt,而且相同串的dfs序号是一样的(就是说一个结尾节点可能包含好多个不同编号的串),左区间取最前的一个(比如dfs到x节点,编号为2,x节点存着两个串,那么它们的左区间都为2,而序号要加两次)

参考自:http://blog.csdn.net/xym_CSDN/article/details/51340321

代码:

 #include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#define M 500009
using namespace std;
vector <int> q[M];
int cnt,trie[M][],num[M],com[M],out[M],dat[M],sum[M<<],lc[M<<],rc[M<<];
char s[M]; void ins(int id,char *str)
{
int i,l=strlen(str),j=,k;
for (i=l-;i>=;i--,j=trie[j][k])
if (!trie[j][k=str[i]-'a']) trie[j][k]=++cnt;
num[j]++; q[j].push_back(id);
} void dfs(int x)
{
int i;
for (i=;i<num[x];i++) com[q[x][i]]=cnt+;
for (i=;i<num[x];i++) dat[++cnt]=q[x][i];
for (i=;i<;i++) if (trie[x][i]) dfs(trie[x][i]);
for (i=;i<num[x];i++) out[q[x][i]]=cnt;
} void build(int l,int r,int cur,int _cur,int x)
{
sum[cur]=sum[_cur]+;
if (l==r) return; int mid=l+r>>;
if (x<=mid) lc[cur]=++cnt,rc[cur]=rc[_cur],build(l,mid,lc[cur],lc[_cur],x);
else lc[cur]=lc[_cur],rc[cur]=++cnt,build(mid+,r,rc[cur],rc[_cur],x);
} int ask(int L,int R,int l,int r,int k)
{
if (L==R) return L;
int mid=L+R>>,t=sum[lc[r]]-sum[lc[l]];
if (t>=k) return ask(L,mid,lc[l],lc[r],k);
else return ask(mid+,R,rc[l],rc[r],k-t);
} int main()
{
int n,i,x; scanf("%d",&n);
for (i=;i<=n;i++) scanf("%s",s),ins(i,s);
for (cnt=,dfs(),cnt=n+,i=;i<=n;i++) build(,n,i+,i,dat[i]);
for (i=;i<=n;i++)
{
scanf("%d",&x);
if (sum[out[i]+]-sum[com[i]]<x) printf("-1\n");
else printf("%d\n",ask(,n,com[i],out[i]+,x));
}
return ;
}

【bzoj3439】kpm的mc密码 题解的更多相关文章

  1. BZOJ3439: Kpm的MC密码

    3439: Kpm的MC密码 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 166  Solved: 79[Submit][Status] Descr ...

  2. BZOJ3439 Kpm的MC密码(可持久化trie)

    将串反过来就变成查询前缀了.考虑建一棵可持久化trie,查询时二分答案,均摊一下复杂度即为O(mlogn). #include<iostream> #include<cstdio&g ...

  3. 【BZOJ3439】Kpm的MC密码 Trie树+可持久化线段树

    [BZOJ3439]Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当 ...

  4. 【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)

    3439: Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记 ...

  5. 【BZOJ】【3439】Kpm的MC密码

    Trie树/可持久化线段树 神题啊……搞了我一下午= =(其实第233个提交也是我的) 我一开始的思路:这个找kpm串的过程,其实就跟在AC自动机上沿fail倒着往下走是差不多的(看当前是哪些点的后缀 ...

  6. BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )

    把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...

  7. 【BZOJ3439】Kpm的MC密码 trie树+主席树

    Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身 ...

  8. 【bzoj3439】Kpm的MC密码 可持久化Trie树

    题目描述 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了. ...

  9. BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)

    背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了... 描述 ...

随机推荐

  1. ListView介绍

    原文:http://blog.csdn.net/qingye_love/article/details/13772391?utm_source=tuicool&utm_medium=refer ...

  2. Generic Access Profile

    转自:https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile ​​Assigned numbe ...

  3. Freemarker遍历map

    map的键尽量是字符串或者数字类型: <#if map?exists> <#list map?keys as key> ${key}---${map[key]} </#l ...

  4. 用CocoaPods做iOS程序的依赖管理(转摘)

    转摘自:http://blog.devtang.com/blog/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/ 文档更新说明 2012-1 ...

  5. oracle限制ip訪問

    我這oracle版本為11.2.0.4,裝的GRID,所以在grid用戶下編輯sqlnet.ora 1.cd  /grid/product/11.2.0/network/admin 2.編輯sqlne ...

  6. hdu 4044 2011北京赛区网络赛E 树形dp ****

    专题训练 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm ...

  7. 跟着鸟哥学Linux系列笔记0-扫盲之概念

    相关缩写全称: POSIX(Portable Operation System Interface):可携式操作系统接口,重点在于规范内核与应用之间的接口,由IEEE定义发布 IEEE: 美国电气与电 ...

  8. PMP 第三章 单个项目的项目管理标准

    1 项目管理五大过程组分别是什么? 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组 2 启动项目组是干什么?包含哪些过程?每个阶段都需要启动吗? 启动过程组:获得授权,定义一个新项目或现有 ...

  9. 【转】GeoHash核心原理解析

    好久没更新过博客了,先转载一篇文章吧. 源地址:http://www.cnblogs.com/LBSer/p/3310455.html 引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按 ...

  10. 智能车学习(五)—— dac学习

    一.代码共享: 1.dac.h #ifndef DAC_H_ #define DAC_H_ #include "common.h" // 2.2 DAC控制寄存器0 位定义 #de ...