题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号

首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号

然后考虑对字符串排序 那么对于每一个字符串以它为前缀的字符串一定是连续的 那么就转化成了区间第k小 这个用可持久化线段树能够解决

排序自然不能直接排 既然是字符串 考虑Trie树+DFS就可以 注意字符串有反复的 小心

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
struct Trie{
vector<int> num;
Trie *son[26];
void* operator new (size_t size);
}*root,*mempool,*C;
struct Segtree{
Segtree *ls,*rs;
int num;
void* operator new (size_t size,Segtree *_,Segtree *__,int ___);
}*tree[M],*_mempool,*G;
int n,a[M],l[M],r[M],tot;
char s[M];
void* Trie :: operator new (size_t size)
{
if(C==mempool)
{
C=new Trie[1<<15];
mempool=C+(1<<15);
memset(C,0,sizeof(Trie)*(1<<15) );
}
return C++;
}
void* Segtree :: operator new (size_t size,Segtree *_,Segtree *__,int ___)
{
if(G==_mempool)
{
G=new Segtree[1<<15];
_mempool=G+(1<<15);
memset(G,0,sizeof(Segtree)*(1<<15) );
}
G->ls=_;
G->rs=__;
G->num=___;
return G++;
}
void Insert(Trie*&p,char *str,int pos)
{
if(!p) p=new Trie;
if(!*str)
{
p->num.push_back(pos);
return ;
}
Insert(p->son[(*str)-'a'],str+1,pos);
}
void DFS(Trie *p)
{
int i;
vector<int>::iterator it;
p->num.begin();
int temp=tot+1;
for(it=p->num.begin();it!=p->num.end();it++)
{
a[++tot]=*it;
l[*it]=temp;
}
for(i=0;i<26;i++)
if(p->son[i])
DFS(p->son[i]);
for(it=p->num.begin();it!=p->num.end();it++)
r[*it]=tot;
}
Segtree* Build_Tree(Segtree *p,int x,int y,int val)
{
int mid=x+y>>1;
if(x==y) return new (0x0,0x0,p->num+1) Segtree;
if(val<=mid) return new (Build_Tree(p->ls,x,mid,val),p->rs,p->num+1) Segtree;
else return new (p->ls,Build_Tree(p->rs,mid+1,y,val),p->num+1) Segtree;
}
int Get_Ans(Segtree *p1,Segtree *p2,int x,int y,int k)
{
int mid=x+y>>1;
if(x==y) return mid;
int temp=p2->ls->num-p1->ls->num;
if(k<=temp) return Get_Ans(p1->ls,p2->ls,x,mid,k);
else return Get_Ans(p1->rs,p2->rs,mid+1,y,k-temp);
}
int main()
{
int i,j,k;
cin>>n;
for(i=1;i<=n;i++)
{
scanf("%s",s+1);
int temp=strlen(s+1);
for(j=1;j<<1<=temp;j++)
swap(s[j],s[temp+1-j]);
Insert(root,s+1,i);
}
DFS(root);
tree[0]=new (0x0,0x0,0) Segtree;
tree[0]->ls=tree[0]->rs=tree[0];
for(i=1;i<=n;i++)
tree[i]=Build_Tree(tree[i-1],1,n,a[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
if(k>r[i]-l[i]+1) puts("-1");
else printf("%d\n", Get_Ans(tree[l[i]-1],tree[r[i]],1,n,k) );
}
}

BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树的更多相关文章

  1. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  2. [BZOJ 4771]七彩树(可持久化线段树+树上差分)

    [BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...

  3. BZOJ.4771.七彩树(可持久化线段树)

    BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...

  4. BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...

  5. BZOJ 2588: Spoj 10628. Count on a tree-可持久化线段树+LCA(点权)(树上的操作) 无语(为什么我的LCA的板子不对)

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 9280  Solved: 2421 ...

  6. 【BZOJ 3524】【Poi2014】Couriers 可持久化线段树

    为什么这个主席树叫可持久化线段树,我不知道,具体得问达神.我无限T,然后DaD3zZ一针见血地指出了我的N*50爆内存导致无限编译超时O)ZO)ZO)Z真是太神啦.以图为鉴: 达神题解传送门:http ...

  7. BZOJ 4771: 七彩树 可持久化线段树+树链的并

    这个思路挺有意思的 ~ 利用树链的并来保证每个颜色只贡献一次,然后用可持久化线段树维护 code: #include <set> #include <cstdio> #incl ...

  8. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  9. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

随机推荐

  1. poj1787 Charlie's Change

    思路: 完全背包,记录路径. 实现: #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; ] ...

  2. UVM基础之------uvm phases机制

    代码的书写顺序会影响代码的实现,在不同的时间做不同的事情,这是UVM phase的设计哲学,UVM phase提供了一个通用的TB phase 解决方案.支持显示的隐式的同步方案,运行时刻的线程控制和 ...

  3. NGS数据格式介绍

    一般情况下,从Illumina平台上得到的测序,其数据格式是Fastq格式,可以称之为原始数据(Raw data).事实上直接的下机数据是显微拍摄得到的图像信息.但是一般都会用Bcl2Fastq软件将 ...

  4. 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList

    package algorithms; import java.util.ArrayList; import java.util.Stack; /** * public class ListNode ...

  5. PHP下载压缩包文件

    PHP 压缩文件需要用到 ZipArchive 类,Windows 环境需要打开 php_zip.dll扩展. 压缩文件 $zip = new ZipArchive(); // 打开一个zip文档,Z ...

  6. Listview异步加载图片之优化篇

    在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...

  7. c++运行程序闪退

        以最简单程序为例       法一:在主函数末尾下一行getchar();即可.需要注意的是这种方法并不适合所有程序,       法二:<1>先在程序开头加上头文件#includ ...

  8. Linux:RHEL7图形界面转文字

    1.7 Systemd初始化进程 Linux操作系统开机过程首先从BIOS开始→进入"Boot Loader"→加载系统内核→内核进行初始化→启动初始化进程.初始化进程作为系统第一 ...

  9. 移动端禁止滑动的js处理方式

    下面是禁止移动端滑动事件的方式,慎用  document.querySelector('body').addEventListener('touchmove', function (ev) {     ...

  10. BZOJ 3916 [Baltic2014]friends

    [题解] 暴力枚举添加字符的位置,然后判断去掉这个位置的字符串是否有由两个相同的串拼接而成.本题的n的范围为200W,暴力判断会TLE,所以要使用哈希. #include<cstdio> ...