题目链接  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 + 主席树)的更多相关文章

  1. HDU 5790 Prefix(字典树+主席树)

    Prefix Time Limit: 2000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  2. 【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是上次询问的结 ...

  3. BZOJ_3207_花神的嘲讽计划1_(Hash+主席树)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3207 给出一个长度为\(n\)的串,以及\(m\)个长度为\(k\)的串,求每个长度为\(k\ ...

  4. hdu 2665 Kth number 主席树

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...

  5. 【BZOJ3207】花神的嘲讽计划Ⅰ Hash+主席树

    [BZOJ3207]花神的嘲讽计划Ⅰ Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快 ...

  6. HDU 4866 Shooting (主席树)

    题目链接  HDU 4866 题意  给定$n$条线段.每条线段平行$x$轴,离x轴的距离为$D$,覆盖的坐标范围为$[L, R]$.   现在有$m$次射击行动,每一次的射击行动可以描述为在横坐标$ ...

  7. loj#6169. 相似序列 hash+主席树

    因为他的相似是在排完序下的 那我就在排序的情况下hash啊 这怎么hash啊 主席树啊! 没了 #include <bits/stdc++.h> #define MAXNODE 50000 ...

  8. HDU 5919 Sequence II 主席树

    Sequence II Problem Description   Mr. Frog has an integer sequence of length n, which can be denoted ...

  9. HDU 4417 Super Mario 主席树

    分析:找一个区间里小于等于h的数量,然后这个题先离散化一下,很简单 然后我写这个题主要是熟悉一下主席树,其实这个题完全可以离线做,很简单 但是学了主席树以后,我发现,在线做,一样简单,而且不需要思考 ...

随机推荐

  1. 有关fcrackzip的使用介绍(来自网络)

    本文转自:http://longxiaz.blog.163.com/blog/static/131452420201282844545197/ 主要用到的工具是fcrackzip.别的工具没去测试,f ...

  2. 分享一个编程学习网站:https://github.com/justjavac/free-programming-books-zh_CN

    分享一个编程学习网站:https://github.com/justjavac/free-programming-books-zh_CN

  3. IAR生成bin,HEX文件

    1.生成bin,hex文件 options->output converter->output format binary:.bin文件:intel extended:hex文件. 生成的 ...

  4. ACM训练联盟周赛 A. Teemo's bad day

    65536K   Today is a bad day. Teemo is scolded badly by his teacher because he didn't do his homework ...

  5. POJ3216 最小路径覆盖

    首先说一下题意,Q个区域,M个任务,每个区域任务可能有多个,然后给你个到各地所需时间的矩阵,每个任务都有开始和持续时间,问最少需要多少工人? 每个工人只能同时执行一个任务. 通过题意,我的瞬间反应就是 ...

  6. iOS开发-NSLog不打印设置 Prefix

    首先在-Prefix.pch,文件里添加如下代码 #ifdef DEBUG #define NSLog(...) NSLog(__VA_ARGS__) #define debugMethod() NS ...

  7. 十分钟了解socket

    socket通讯方式------socket是TCP/IP协议的网络数据通讯接口(一种底层的通讯的方式).socket是IP地址和端口号的组合.例如:192.168.1.100:8080 原理就是TC ...

  8. 安装python包

    开始--cmd pip install pymongo 直到最后给出提示successfull install pymongo-**(版本号,最新的)

  9. HTTP的一些概念

    1. 什么是回调? 回调是异步编程时的基础,将后续逻辑封装成起始函数的参数,逐层嵌套 2. 什么是同步/异步? 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指: ...

  10. ubuntu14.04 不能关机,一直停在关机界面

    1.emotion: 最近在使用Ubuntu14.04 LTS时,输入shutdown -h now之后,Ubuntu就一直停在关机界面,始终不能shutdown,不得不手动按下电源button.忍受 ...