HDU 5790 Prefix(Hash + 主席树)
题目链接 Prefix
题意 给定一个字符串序列,求第$l$个字符串到第$r$个字符串之间有多少个不同的前缀
强制在线
考虑$Hash$
首先把所有前缀都$hash$出来,按顺序组成一个长度不超过$10^{5}$的序列。
然后放入主席树,问题转化为查询区间内不同数字的个数。
查询的时候找到的起始字符串的开头和终止字符串的结尾就可以了。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef unsigned long long ULL; const int N = 1e5 + 10;
const int M = 4e6 + 10; ULL a[N], b[N], val[M], g[200];
int c[N], d[N], T[M], lson[M], rson[M], nxt[N], idx, len, n, tot, nn, Z;
char st[N]; int build(int l, int r){
int rt = tot++;
val[rt] = 0;
int m = (l + r) >> 1;
if(l != r){
lson[rt] = build(l, m);
rson[rt] = build(m + 1, r);
}
return rt;
} int update(int rt, int pos, int v){
int newrt = tot++, tmp = newrt;
int l = 1, r = n;
val[newrt] = val[rt] + v;
while(l < r)
{
int m = (l + r) >> 1;
if(pos <= m)
{
lson[newrt] = tot++;
rson[newrt] = rson[rt];
newrt = lson[newrt];
rt = lson[rt];
r = m;
}
else
{
rson[newrt] = tot++;
lson[newrt] = lson[rt];
newrt = rson[newrt];
rt = rson[rt];
l = m + 1;
}
val[newrt] = val[rt] + v;
}
return tmp;
} int query(int rt, int pos){
int ret = 0;
int l = 1, r = n;
while(pos > l){
int m = (l + r) >> 1;
if (pos <= m){
ret += val[rson[rt]];
rt = lson[rt];
r = m;
}
else{
l = m + 1;
rt = rson[rt];
}
}
return ret + val[rt];
} int ask(int l, int r){ return query(T[r], l); } void init(){
tot = 0;
memset(nxt, -1, sizeof(nxt));
rep(i, 1, n) b[i - 1] = a[i];
sort(b, b + n);
int cnt = unique(b, b + n) - b;
T[0] = build(1, n);
rep(i, 1, n){
int id = lower_bound(b, b + cnt, a[i]) - b;
if(nxt[id] == -1)
T[i] = update(T[i - 1], i, 1);
else{
int t = update(T[i - 1], nxt[id], -1);
T[i] = update(t, i, 1);
}
nxt[id] = i;
} } inline ULL get(char ch){ return g[(int)ch - 97]; } int main(){ srand(time(NULL));
rep(i, 0, 100){
int yy = rand() % 3 + 1;
g[i] = 1;
rep(j, 1, yy) g[i] *= rand();
} while (~scanf("%d", &nn)){
Z = 0;
n = 0;
rep(i, 1, nn){
scanf("%s", st);
len = strlen(st);
ULL haha = 0LL;
rep(j, 0, len - 1){
++n;
haha = haha * 233LL + 6843 * get(st[j]);
a[n] = haha;
} c[i] = d[i - 1] + 1;
d[i] = n; } init();
int q;
scanf("%d", &q);
Z = 0;
while (q--){
int x, y;
scanf("%d%d", &x, &y);
int ll = (Z + x) % nn + 1;
int rr = (Z + y) % nn + 1;
if (ll > rr) swap(ll, rr);
printf("%d\n", Z = ask(c[ll], d[rr]));
} } return 0; }
HDU 5790 Prefix(Hash + 主席树)的更多相关文章
- HDU 5790 Prefix(字典树+主席树)
Prefix Time Limit: 2000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...
- 【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_3207_花神的嘲讽计划1_(Hash+主席树)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3207 给出一个长度为\(n\)的串,以及\(m\)个长度为\(k\)的串,求每个长度为\(k\ ...
- hdu 2665 Kth number 主席树
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- 【BZOJ3207】花神的嘲讽计划Ⅰ Hash+主席树
[BZOJ3207]花神的嘲讽计划Ⅰ Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快 ...
- HDU 4866 Shooting (主席树)
题目链接 HDU 4866 题意 给定$n$条线段.每条线段平行$x$轴,离x轴的距离为$D$,覆盖的坐标范围为$[L, R]$. 现在有$m$次射击行动,每一次的射击行动可以描述为在横坐标$ ...
- loj#6169. 相似序列 hash+主席树
因为他的相似是在排完序下的 那我就在排序的情况下hash啊 这怎么hash啊 主席树啊! 没了 #include <bits/stdc++.h> #define MAXNODE 50000 ...
- HDU 5919 Sequence II 主席树
Sequence II Problem Description Mr. Frog has an integer sequence of length n, which can be denoted ...
- HDU 4417 Super Mario 主席树
分析:找一个区间里小于等于h的数量,然后这个题先离散化一下,很简单 然后我写这个题主要是熟悉一下主席树,其实这个题完全可以离线做,很简单 但是学了主席树以后,我发现,在线做,一样简单,而且不需要思考 ...
随机推荐
- 【windows】win7 sp1 系统语言中英文切换
注:Windows 7 Ultimate and Windows 7 Enterprise (旗舰版和企业版) 可以直接在控制面板/地区和语言中修改显示语言,其他系统不行 进入网站下载相关的MUI包安 ...
- debian安装之后使用android手机上网
安装debian的过程中,没有连接网线.因为路由器在客厅,电脑在卧室,拖条长长的线很不方便. 断网安装完成之后,通过usb连上i9250. 在i9250上,执行以下操作: “设置”--->“更多 ...
- Linux学习-开机过程的问题解决
忘记 root 密码的解决之道 新版的 systemd 的管理机制中,默认的 rescue 模式是无法直接取得 root 权限的喔!还是得要 使用 root 的密码才能够登入 rescure 环境.没 ...
- PHP-redis命令之 列表(lists)
三.列表(lists) 1.lpush:将所有指定的值插入到存于 key 的列表的头部.如果 key 不存在,那么在进行 push 操作前会创建一个空列表. 如果 key 对应的值不是一个 list ...
- Selenium WebDriver-操作键盘事件
# 注意: !!!操作操作系统的按键,需要先装pywin32,然后通过交互模式import win32api和import win32con判断是否安装成功,需要重启下cmd进入交互模式# 下载链接: ...
- spark作业
假定用户有某个周末网民网购停留时间的日志文本,基于某些业务要求,要求开发 Spark应用程序实现如下功能: 1.实时统计连续网购时间超过半个小时的女性网民信息. 2.周末两天的日志文件第一列为姓名,第 ...
- 内存分配机制malloc&&alloca&&realloc
<1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2>在栈上创建 在执 ...
- 九度oj 题目1362:左旋转字符串(Move!Move!!Move!!!)
题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”ab ...
- 【bzoj1604】[Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 旋转坐标系+并查集+Treap/STL-set
题目描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”.每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi≤ ...
- 【Luogu】P2150寿司晚宴(状压DP)
题目链接 反正……我是没什么想法了,全程看题解 (或者说自己想了半天错解) 因为大于根n的质数最多只会在一个数里出现一种,所以可以把数拆成两部分:小数的二进制集合和大数. 然后把大数一样的放到一起DP ...