题目链接  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. Maven配置项目依赖使用本地仓库的方法汇总

    Maven配置项目使用本地仓库有以下方式实现: 1.类似本地仓库,但是属于本地依赖,比如某个JAR包是引用第三方的,直接放在了项目的lib文件夹,那么此时可以如下配置项目的POM: <depen ...

  2. JS处理数据四舍五入,tofixed与round的区别

    此区别是在做微信端有关绑定设备数据曲线平滑处理的过程中,进行验证时候无意发现. 1 .tofixed方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.例如将数据Num保留 ...

  3. 利用http录制jmeter脚本

    1.在WorkBench下新建HTTP(S) Test Script Recorder,默认端口号为8080,假如8080被占用,则使用其他端口号:且为了使录制保存到线程组里,也同时新建一个线程组Tr ...

  4. P3388 【模板】割点(割顶)

    P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式 ...

  5. VS重置开发环境的方法

    经常由于各种插件的原因,导致VS有使用过程中出现断点进不去等各种情况的时候,这个方法可以让你的VS回到最初安装的状态,当然,这时候,各种配置也没有了,不到万不得已就勿使用. 下面以Vs2015来说明: ...

  6. [POJ 1006] Biorhythms C++解题

        Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 107569   Accepted: 33365 ...

  7. TPS限流

    限流是高可用服务需要具备的能力之一 ,粗暴简单的就像我们之前做的并发数控制.好一点的有tps限流,可用令牌桶等算法实现.<亿级流量网站架构核心技术>一书P67限流详解也有讲.dubbo提供 ...

  8. 大数据学习——scala函数与方法

    package com /** * Created by Administrator on 2019/4/8. */ object TestMap { def ttt(f: Int => Int ...

  9. 基于 FPGA 的图像边缘检测

    本文主要内容是实现图像的边缘检测功能 目录 mif文件的制作 调用 ip 核生成rom以及在 questasim 仿真注意问题 灰度处理 均值滤波:重点是3*3 像素阵列的生成 sobel边缘检测 图 ...

  10. [python][oldboy]strip