hdu_5790_Prefix(trie+主席树)
题目链接:hdu_5790_Prefix
题意:
给你n个字符串,字符串总长度不超过10W,然后给你一个区间,问你这个区间的字符串不相同的前缀有多少个。
题解:
由于z与上一个答案有关,所以强制在线,区间询问可以用主席树搞搞。
不同前缀的话,我们可以用一个trie来记录每一个节点的最晚出现时间,也就代表了这个前缀最晚出现的时间,然后保存到对应的主席树中。
这样就转换为询问区间不大于l的数有多少个。
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int N=1e5+;
char s[N];
int root[N],tot,n,q;
struct node{int l,r,sum;}T[*N]; void update(int &x,int y,int pos,int l=,int r=n)
{
T[++tot]=T[y],T[tot].sum++,x=tot;
if(l==r)return;
int m=l+r>>;
if(pos<=m)update(T[x].l,T[y].l,pos,l,m);
else update(T[x].r,T[y].r,pos,m+,r);
} int query(int x,int y,int k,int l=,int r=n)
{
if(l==r)return T[x].sum-T[y].sum;
int m=l+r>>;
if(k<=m)return query(T[x].l,T[y].l,k,l,m);
else return T[T[x].l].sum-T[T[y].l].sum+query(T[x].r,T[y].r,k,m+,r);
} struct Trie{
int tr[N][],tot,mx[N];
void nd(){mx[++tot]=,memset(tr[tot],,sizeof(tr[tot]));}
void init(){tot=-,nd();}
void insert(char *s,int time)
{
int t1=root[time-],t2;
for(int i=,x=;s[i]!='\0';i++)
{
if(!tr[x][s[i]-'a'])
{
nd(),update(t2,t1,);
t1=t2,tr[x][s[i]-'a']=tot,mx[tot]=time,x=tot;
}
else update(t2,t1,mx[x=tr[x][s[i]-'a']]+),t1=t2,mx[x]=time;
}
root[time]=t1;
}
}trie; void init(){tot=;trie.init();} int main()
{
while(~scanf("%d",&n))
{
init();
F(i,,n)scanf("%s",s),trie.insert(s,i);
scanf("%d",&q);
int l,r,z=;
F(i,,q)
{
scanf("%d%d",&l,&r);
l=(z+l)%n+,r=(z+r)%n+;
if(l>r)l^=r,r^=l,l^=r;
printf("%d\n",z=query(root[r],root[l-],l));
}
}
return ;
}
hdu_5790_Prefix(trie+主席树)的更多相关文章
- 【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)
3439: Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记 ...
- 【BZOJ3439】Kpm的MC密码 trie树+主席树
Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身 ...
- bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...
- 【HDU - 5790 】Prefix(主席树+Trie树)
BUPT2017 wintertraining(15) #7C 题意 求[min((Z+L)%N,(Z+R)%N)+1,max((Z+L)%N,(Z+R)%N)+1]中不同前缀的个数,Z是上次询问的结 ...
- BZOJ-3439:Kpm的MC密码(Trie+DFS序+主席树)
背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了... 描述 ...
- BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)
题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...
- 4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树
很容易的一道题目.大概.不过我空间计算失误MLE了 我草草的计算了一下没想到GG了. 关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了. 题目没有明确指出 在任意时刻数组长度为有限制什么 ...
- hdu5790 Prefix(Trie树+主席树)
Problem Description Alice gets N strings. Now she has Q questions to ask you. For each question, she ...
- 【BZOJ4571】美味(主席树)
[BZOJ4571]美味(主席树) 题面 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 ...
随机推荐
- 【1】Hover 效果收集
各种 hover 效果 github repository>> git 仓库 1. 背景图的 hover 效果 原页面>> githubSite>>
- 安卓自动化测试工具一:Monkey
一:monkey的用途:主要用于稳定性测试,模拟用户操作 二.monkey的基本使用 monkey文档地址:"<android_sdk>/docs/tools/help/monk ...
- nodejs中express安装失败解决方法
http://jingyan.baidu.com/article/922554468a3466851648f419.html
- oracle_sequence用法
1. About Sequences(关于序列) 序列是数据库对象一种.多个用户可以通过序列生成连续的数字以此来实现主键字段的自动.唯一增长,并且一个序列可为多列.多表同时使用.序列消除了串行化 ...
- 著名清理软件(CCleaner) 5.24.5841 中文版
软件名称: 著名清理软件(CCleaner) 软件语言: 多国语言 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 5.7MB 图片预览: 软件简介: CCleaner的体积小, ...
- Kafka单机版安装(CentOS 7环境下)
一.环境操作系统和软件版本介绍 1.环境操作系统为CentOS Linux release 7.2.1511 (Core) 可用cat /etc/redhat-release查询 2.软件版本 Kaf ...
- (转帖)oracle sql 语句优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- CodeForces 689E Mike and Geometry Problem
离散化,树状数组,组合数学. 这题的大致思路和$HDU$ $5700$一样.都是求区间交的问题.可以用树状数组维护一下. 这题的话只要计算每一个$i$被统计了几次,假设第$i$点被统计了$ans[i] ...
- Unity人工智能学习—确定性AI算法之追踪算法二
转自:http://blog.csdn.net/zhangxiao13627093203/article/details/47658673 上一篇讲到了追踪算法的比较简单的形式,看上去比较假,因为AI ...
- eclipse中link方式安装插件
今天需要给eclipse安装svn插件,觉得link方式便于管理于是就打算用这种方式来安装. 我电脑上的eclipse的安装目录是 E:\tools\eclipse 下面开始安装 1.在ecl ...