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

将字符串一个个的插入字典树,在字典树维护好有该前缀串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. mysql类型与java类型对应异常场景

    MySQL的bigint unsigned类型,对应java的BigInteger类型,在基于mybatis框架时,如果我将bigint unsigned类型的字段的返回放在一个map的返回类型中时. ...

  2. IE6中png背景图片透明的最好处理方法

    在IE6浏览器下png(24位)的图片显示是不能透明的. 1.处理办法就是用DDPngMin.js <!--[if IE 6]> <script src="js/DDPng ...

  3. ASP.NET页面之间传值Application(5)

    Application对象的作用范围是整个全局,也就是说对所有用户都有效.它在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所 以可以在不同页面中对它进行存取.它和Session变量的区别 ...

  4. java高精度类尝试

    java高精度尝试, poj2109,比较坑的题目 import java.io.*; import java.util.*; import java.math.*; public class Mai ...

  5. BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元

    大前提,把两个点的组合看成一种状态 x 两种思路 O(n^7) f[x]表示在某一个点的前提下,这个状态经过那个点的概率,用相邻的点转移状态,高斯一波就好了 O(n^6) 想象成臭气弹,这个和那个的区 ...

  6. WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ

    之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ ...

  7. typescript的入门

    命令行使用tsc 1.安装typescript npm install -g typescript 2.新建一个index.ts 输入export hello class{} 3.编译 tsc ind ...

  8. Kafka自我学习1-Multi-broker cluster

    ====================================Testing environment =========================================== ...

  9. C#弱引用

    加菲猫 Just have a little faith. C#弱引用 .NET框架提供了另一有趣的特色,被用于实现多样的高速缓存.在.NET中弱引用通过System.WeakReference类实现 ...

  10. 通过js修改微信内置浏览器title

    document.setTitle = function(t) { document.title = t; var i = document.createElement('iframe'); i.sr ...