hdu5790 Prefix(Trie树+主席树)
For each test case, the first line contains one integer N(1≤N≤100000).
Then next N lines contain N strings and the total length of N strings is between 1 and 100000. The next line contains one integer Q(1≤Q≤100000).
We define a specail integer Z=0. For each query, you get two integer L, R(0=<L,R<N). Then the query interval [L,R] is [min((Z+L)%N,(Z+R)%N)+1,max((Z+L)%N,(Z+R)%N)+1]. And Z change to the answer of this query.
abc
aba
baa
3
0 2
0 1
1 1
6
3
题意:给你n个字符串,问你第L个字符串到R个字符串中不同前缀的个数,且强制在线。
思路:这题和之前d-query这题很相似,那题问的是区间内不同数的种类。这题问的是不同前缀个数,所以我们可以先把所有的字符串插入到Trie树中,然后每次插入维护每一个节点最后被遍历到的时刻,然后用主席树维护下就行了。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define inf 99999999
#define pi acos(-1.0)
#define Key_value ch[ch[root][1]][0]
#define maxn 100050
#define maxnode 1000050
char s[maxn];
int n;
int ch[maxnode][28];
int val[maxnode];
int sz;
#define M 1000500*30
int lson[M],rson[M],c[M],T[M];
int th;
int build(int l,int r)
{
int i,j,newroot=++th,mid;
c[newroot]=0;
if(l!=r){
mid=(l+r)/2;
lson[newroot]=build(l,mid);
rson[newroot]=build(mid+1,r);
}
return newroot;
}
int update(int root,int zhi,int value)
{
int i,j,newroot=++th;
int tmp=newroot;
int l=1,r=n,mid;
c[newroot]=c[root]+value;
while(l<r){
mid=(l+r)/2;
if(zhi<=mid){
r=mid;
lson[newroot]=++th;rson[newroot]=rson[root];
newroot=lson[newroot];root=lson[root];
}
else{
l=mid+1;
lson[newroot]=lson[root];rson[newroot]=++th;
newroot=rson[newroot];root=rson[root];
}
c[newroot]=c[root]+value;
}
return tmp;
}
int question(int root,int pos)
{
int i,j;
int sum=0;
int l=1,r=n,mid;
while(l<r){
mid=(l+r)/2;
if(pos<=mid){
r=mid;
sum+=c[rson[root] ];
root=lson[root];
}
else{
l=mid+1;
root=rson[root];
}
}
sum+=c[root];
return sum;
}
void init(){
sz=0;memset(ch[0],0,sizeof(ch[0]));
memset(val,0,sizeof(val));
}
int idx(char c){
return c-'a';
}
void charu(char *s,int tm){
int u=0,len=strlen(s),i,c;
T[tm]=T[tm-1];
for(i=0;i<len;i++){
c=idx(s[i]);
if(!ch[u][c]){
sz++;
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=tm;
T[tm]=update(T[tm],tm,1);
ch[u][c]=sz;
u=ch[u][c];
}
else if(ch[u][c]){
T[tm]=update(T[tm],val[ch[u][c] ],-1);
val[ch[u][c] ]=tm;
T[tm]=update(T[tm],tm,1);
u=ch[u][c];
}
}
}
int main()
{
int m,i,j;
while(scanf("%d",&n)!=EOF)
{
init();
th=0;
T[0]=build(1,n);
for(i=1;i<=n;i++){
scanf("%s",s);
charu(s,i);
}
scanf("%d",&m);
int l,r,z=0,t1,t2;
for(i=1;i<=m;i++){
scanf("%d%d",&l,&r);
l=(z+l)%n+1;
r=(z+r)%n+1;
if(l>r)swap(l,r);
z=question(T[r],l);
printf("%d\n",z);
}
}
return 0;
}
hdu5790 Prefix(Trie树+主席树)的更多相关文章
- 线段树简单入门 (含普通线段树, zkw线段树, 主席树)
线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...
- HDU5790 Prefix 字典树+主席树
分析:这个题和spoj的d_query是一个题,那个是求一段区间里有多少个不同的数字,这里是统计有多少个不同的前缀 用字典树进行判重,(和查询不同的数字一样)对于每个不同的前缀,只保留它最后一次出现的 ...
- 【BZOJ3439】Kpm的MC密码 trie树+主席树
Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身 ...
- HDU 5790 Prefix(Hash + 主席树)
题目链接 Prefix 题意 给定一个字符串序列,求第$l$个字符串到第$r$个字符串之间有多少个不同的前缀 强制在线 考虑$Hash$ 首先把所有前缀都$hash$出来,按顺序组成一个长度不超过 ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 635 Solved: 177[Submit][Stat ...
- BZOJ 4539: [Hnoi2016]树 [主席树 lca]
4539: [Hnoi2016]树 题意:不想写.复制模板树的子树,查询两点间距离. *** 终于有一道会做的题了...... 画一画发现可以把每次复制的子树看成一个大点来建一棵树,两点的lca一定在 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- UOJ#218. 【UNR #1】火车管理 线段树 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ218.html 题解 如果我们可以知道每次弹出栈之后新的栈顶是什么,那么我们就可以在一棵区间覆盖.区间求和 ...
随机推荐
- 自定义注解,更优雅的使用MP分页功能
分页功能使用 MP的分页功能是通过MyBatis的插件实现的,使用起来也非常简单.下面先介绍下使用方式. step1:配置分页插件 @Configuration @EnableTransactionM ...
- TeamView WaitforConnectFailed错误原因
更新到最新版本并重启如下服务 检查TCP IPV4是否选中
- Haproxy-1.8.20 根据路径(URI)转发到后端不同集群
HAProxy根据不同的URI 转发到后端的服务器组 1 ) 实验内容说明: 1.1 ) 根据不同的URI 转发到后端的服务器组. /a /b 和其他 默认使用其他. 1.2 ) 使用IP介绍: ha ...
- session、cookie、token的区别
从安全性优先级来说: 1.优先级 Cookie<session<token 2. 安全性 Cookie: ①cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺 ...
- 纯原生javascript下拉框表单美化实例教程
html的表单有很强大的功能,在web早期的时候,表单是页面向服务器发起通信的主要渠道.但有些表单元素的样式没办法通过添加css样式来达到满意的效果,而且不同的浏览器之间设置的样式还存在兼容问题,比如 ...
- 【Linux】vim关闭终端的时候,忘记退出vim怎么办
有些时候经常是关闭终端,但是忘记退出vim编辑的文本,每次登陆的时候会提示这个错误 其实很简单,在该文本的路径下,有一个隐藏文件 叫.xxx.txt.swp文件(xxx就是你退出忘记关闭的文件名). ...
- 这难道不是.NET5 的bug? 在线求锤?
hello,最近在对一个使用.NET5项目的认证授权系统进行重构,对.NET 5的授权中间件的源码有些看法. 也希望同学们能帮我理解. 一个朴素的需求 这是一个api项目,默认所有的api都需要授权, ...
- [APUE] 文件 I/O
文件操作相关 API:open, read, write, lseek, close. 多进程共享文件的相关 API:dup, dup2, fcntl, sync, fsync, ioctl. 文件操 ...
- Spring集成GuavaCache实现本地缓存
Spring集成GuavaCache实现本地缓存: 一.SimpleCacheManager集成GuavaCache 1 package com.bwdz.sp.comm.util.test; 2 3 ...
- 流量染色与gRPC服务托管 微服务协作开发、灰度发布之流量染色 灰度发布与流量染色
大规模微服务场景下灰度发布与流量染色实践 https://mp.weixin.qq.com/s/UBoRKt3l91ffPagtjExmYw [go-micro]微服务协作开发.灰度发布之流量染色 - ...