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

将字符串一个个的插入字典树,在字典树维护好有该前缀串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. 【转】cocos2dx 3.x 集成protobuf

    http://www.cnblogs.com/chevin/p/6001872.html vs2013+cocos2dx 3.13.1 这篇博文是集成Lua版本的protobuf,集成C++版本的过程 ...

  2. PHP整数取余返回负数解决办法

    <?php $num1 = 1494313163777; $num2 = 9999; //直接计算取余会出错,出现负数 -8779 //echo $num1 % $num2;exit; //算上 ...

  3. java线程(3)——详解Callable、Future和FutureTask

    回顾: 接上篇博客 java线程--三种创建线程的方式,这篇博客主要介绍第三种方式Callable和Future.比较继承Thread类和实现Runnable接口,接口更加灵活,使用更广泛.但这两种方 ...

  4. vThunder 安装

    vThunder 安装 安装镜像下载地址 https://glm.a10networks.com/downloads A10 全球授权许可管理  https://glm.a10networks.com ...

  5. VS的ncb、pdb文件分析

           原文链接地址:http://blog.csdn.net/changbaolong/article/details/7472685        NCB是"No Compile ...

  6. Acunetix Web Vulnarability Scanner V10.5 详细中文手册

    目录: 0×00.什么是Acunetix Web Vulnarability Scanner ( What is AWVS?) 0×01.AWVS安装过程.主要文件介绍.界面简介.主要操作区域简介(I ...

  7. 2、Distributed Optimization

    一.目录: Distributed dynamic programming (as applied to path-planning problems). Distributed solutions ...

  8. 如何让 linux unzip 命令 不输出结果

    unzip xx.zip > /dev/null 2>&1 unzip xx.zip > /dev/null前半部分是将标准输出重定向到空设备, 后面的2>&1 ...

  9. 列出top中的pid

    #!/usr/bin/env python import os import string #方法1:通过字符串的isdigits来判断 #filelist = os.listdir('/proc') ...

  10. camera摄像原理之三:色温和自动白平衡【转】

    转自:http://blog.csdn.net/ghostyu/article/details/7912863 色温的定义:将黑体从绝对零度开始加温,温度每升高一度称为1开氏度(用字母K表示),当温度 ...