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

将字符串一个个的插入字典树,在字典树维护好有该前缀串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. 一个类似植物大战僵尸的python源码

    # 1 - Import library import pygame from pygame.locals import * import math import random # 2 - Initi ...

  2. 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组

    题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...

  3. AGC018D Tree and Hamilton Path(树+树的重心)

    题目大意: 给你一棵n个结点树,然后根据这棵树构造一个完全图,求完全图的一条最长的哈密顿路径. 构造方式是,完全图中的dis(u, v)就等于树上的u和v的距离. 题解: 这...这..不就是杜教的那 ...

  4. [Leetcode] candy 糖果

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  5. Intellij Idea debug 远程部署的的tomcat项目

    web项目部署到tomcat上之后,有时需要打断点单步调试,如果用的是Intellij idea,可以通过如下方法实现: 开启debug端口,启动tomcat 以tomcat7.0.75为例,打开bi ...

  6. 通过init-connect + binlog 实现MySQL审计功能

    背景: 假设这么一个情况,你是某公司mysql-DBA,某日突然公司数据库中的所有被人为删了. 尽管有数据备份,但是因服务停止而造成的损失上千万,现在公司需要查出那个做删除操作的人. 但是拥有数据库操 ...

  7. DES 加密解密

    [概念] 数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常 ...

  8. AWS nat monitor and route switch script

    This script will monitor another NAT instance and take over its routes if communication with the oth ...

  9. C# 程序Hello World

    先创建一个工程文件->选择的是console application. 然后开始写代码如下: using System; using System.Collections.Generic; us ...

  10. 【Mysql优化】聚簇索引与非聚簇索引概念

    必须为主键字段创建一个索引,这个索引就是所谓的"主索引".主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE.  首先明白两句话: innod ...