都快忘了在这类题的经典做法了……

将字符串一个个的插入字典树,在字典树维护好有该前缀串s的最大编号字符串j,我们记作j控制了前缀串s

对于当前的第i个字符串,维护此时有当前每个字符串控制了多少个前缀串,用一个线段树维护。

由于询问是在线的,所以用主席树来维护。于是对一个询问(l,r),在第r个线段树求一下区间(l,r)的和即为答案。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std;
struct node{int l,r,s;} tree[*];
int go[][],h[],be[];
char s[];
int m,t,n,q; int build(int l,int r)
{
++t; tree[t].l=tree[t].r=tree[t].s=;
if (l==r) return t;
else {
int cur=t,m=(l+r)>>;
tree[cur].l=build(l,m);
tree[cur].r=build(m+,r);
return cur;
}
} int work(int l,int r,int last,int x,int w)
{
++t; tree[t]=tree[last];
if (l==r) {tree[t].s+=w; return t;}
else {
int cur=t,m=(l+r)>>;
if (x<=m) tree[cur].l=work(l,m,tree[last].l,x,w);
else tree[cur].r=work(m+,r,tree[last].r,x,w);
tree[cur].s=tree[tree[cur].l].s+tree[tree[cur].r].s;
return cur;
}
} int ask(int l,int r,int p,int x,int y)
{
if (x<=l&&y>=r) return tree[p].s;
else {
int m=(l+r)>>,s=;
if (x<=m) s+=ask(l,m,tree[p].l,x,y);
if (y>m) s+=ask(m+,r,tree[p].r,x,y);
return s;
}
} int main()
{
while (scanf("%d",&n)!=EOF)
{
t=m=;
h[]=build(,n);
memset(go[],,sizeof(go[]));
for (int i=; i<=n; i++)
{
scanf("%s",s+);
int k=,l=strlen(s+);
h[i]=h[i-];
for (int j=; j<=l; j++)
{
int c=s[j]-'a';
if (!go[k][c]) {go[k][c]=++m; memset(go[m],,sizeof(go[m])); be[m]=;}
k=go[k][c];
if (be[k]) h[i]=work(,n,h[i],be[k],-);
be[k]=i;
}
h[i]=work(,n,h[i],i,l);
}
scanf("%d",&q);
int z=;
for (int i=; i<=q; i++)
{
int l,r;
scanf("%d%d",&l,&r);
l=(z+l)%n+; r=(z+r)%n+;
if (l>r) swap(l,r);
z=ask(,n,h[r],l,r);
printf("%d\n",z);
}
}
return ;
}

hdu5790的更多相关文章

  1. HDU5790 Prefix 字典树+主席树

    分析:这个题和spoj的d_query是一个题,那个是求一段区间里有多少个不同的数字,这里是统计有多少个不同的前缀 用字典树进行判重,(和查询不同的数字一样)对于每个不同的前缀,只保留它最后一次出现的 ...

  2. hdu5790 Prefix(Trie树+主席树)

    Problem Description Alice gets N strings. Now she has Q questions to ask you. For each question, she ...

随机推荐

  1. android开发中常犯的几个错误整理

    新手程序猿,在开发中难免会犯各种各样的错误,以下是整理的一些android开发中常见的错误,一起来看看吧. 1.避免将多个类放在一个文件夹里面,除非是一次性使用的内部类. 就是一个文件,最好给分它同名 ...

  2. BZOJ3073 PA2011Journeys(线段树+bfs)

    线段树优化建图裸题.建两棵线段树,一棵表示入一棵表示出.对题中所给的边新建一个虚拟点,将两段区间拆成线段树上对应区间,出线段树中对应区间所表示的点向虚拟点连边权0的边,虚拟点向入线段树中对应区间所表示 ...

  3. [洛谷P2032]扫描

    题目大意:有一串数,有一个长度为k的木板,求木板每次移动后覆盖的最大值 题解:单调队列 C++ Code: #include<cstdio> using namespace std; co ...

  4. [codeforces] 633C Spy Syndrome 2

    原题 Trie树+dp 首先,我们可以简单的想到一种dp方式,就是如果这一段可以匹配并且可以与前一段接上,那么更新dp[i]为当前字符串的编号,然后倒推就可以得到答案. 但是,显然我们不能O(m)比较 ...

  5. Walk 解题报告

    Walk 题目描述 给定一棵 \(n\) 个节点的树,每条边的长度为 \(1\),同时有一个权值\(w\).定义一条路径的权值为路径上所有边的权值的最大公约数.现在对于任意 \(i \in [1,n] ...

  6. JavaScript的相等(==)与全等(===)

    有段代码如下: view source   print? 1 if (![] == []) { 2     //Code 3 } ![] == [],true or false? 我们都知道,ECMA ...

  7. [模拟赛] StopAllSounds

    Description 小松鼠开心地在树之间跳跃着,突然她停了下来.因为眼前出现了一个 拿着专克超萌小松鼠的法宝----超萌游戏机的游客! 超萌游戏机之所以拥有这个名字,是因为它的屏幕是一个n × 2 ...

  8. 用npm安装express时报proxy的错误的解决方法

    首先要说明一点:当使用npm install <module-name>时安装组件时,安装的目录是cmd的目录+node_modules+组件名 例子如下:假如你现在安装express这个 ...

  9. php getimagesize()函数获取图片宽度高度

    //php自带函数 getimagesize() $img_info = getimagesize('tomener.jpg'); echo '<pre>'; print_r($img_i ...

  10. Spring学习--通过注解配置 Bean (一)

    在 classpath 中扫描组件: 组件扫描(component scanning): Spring 能够从 classpath 下自动扫描 , 侦测和实例化具有特定注解的组件. 特定组件包括: @ ...