BZOJ3483 : SGU505 Prefixes and suffixes(询问在线版)
将每个串正着插入Trie A中,倒着插入Trie B中。
并求出每个串在A,B中的dfs序。
每次查询等价于查询在A中dfs序在[la,ra]之间,在B中dfs序在[lb,rb]之间的串的个数,用主席树维护即可。
#include<cstdio>
const int S=2000010,N=2010,M=N*22;
char s[S],ch;
int n,m,i,j,k,posa[N],posb[N],g[S],v[N],nxt[N],ed,la,lb,ra,rb,ans;
inline void read(){
while(!(((ch=getchar())>='a')&&(ch<='z')));
s[k=1]=(ch-'a'+ans)%26;
while(((ch=getchar())>='a')&&(ch<='z'))s[++k]=(ch-'a'+ans)%26;
}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
struct Trie{
int tot,son[S][26],st[S],en[S],dfn;
inline int ins0(){
int x=0;
for(int i=1;i<=k;i++){
if(!son[x][s[i]])son[x][s[i]]=++tot;
x=son[x][s[i]];
}
return x;
}
inline int ins1(){
int x=0;
for(int i=k;i;i--){
if(!son[x][s[i]])son[x][s[i]]=++tot;
x=son[x][s[i]];
}
return x;
}
void dfs(int x){
st[x]=++dfn;
for(int i=0;i<26;i++)if(son[x][i])dfs(son[x][i]);
en[x]=dfn;
}
inline void ask0(){
int x=0;
for(int i=1;i<=k;i++){
if(!son[x][s[i]]){la=ra=0;return;}
x=son[x][s[i]];
}
la=st[x],ra=en[x];
}
inline void ask1(){
int x=0;
for(int i=k;i;i--){
if(!son[x][s[i]]){lb=rb=0;return;}
x=son[x][s[i]];
}
lb=st[x],rb=en[x];
}
}A,B;
int l[M],r[M],val[M],tot,T[S];
int ins(int x,int a,int b,int c){
int y=++tot;val[y]=val[x]+1;
if(a==b)return y;
int mid=(a+b)>>1;
if(c<=mid)l[y]=ins(l[x],a,mid,c),r[y]=r[x];else l[y]=l[x],r[y]=ins(r[x],mid+1,b,c);
return y;
}
int ask(int x,int a,int b){
if(!x)return 0;
if(lb<=a&&b<=rb)return val[x];
int mid=(a+b)>>1,t=0;
if(lb<=mid)t=ask(l[x],a,mid);
if(rb>mid)t+=ask(r[x],mid+1,b);
return t;
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++){
read();
posa[i]=A.ins0();
posb[i]=B.ins1();
}
A.dfs(0),B.dfs(0);
for(i=1;i<=n;i++)add(A.st[posa[i]],B.st[posb[i]]);
for(i=1;i<=A.dfn;i++)for(T[i]=T[i-1],j=g[i];j;j=nxt[j])T[i]=ins(T[i],1,B.dfn,v[j]);
scanf("%d",&m);
while(m--){
read(),A.ask0();
read(),B.ask1();
if(la&&lb)ans=ask(T[ra],1,B.dfn)-ask(T[la-1],1,B.dfn);else ans=0;
printf("%d\n",ans);
}
return 0;
}
BZOJ3483 : SGU505 Prefixes and suffixes(询问在线版)的更多相关文章
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- codeforces432D Prefixes and Suffixes(kmp+dp)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Prefixes and Suffixes You have a strin ...
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
题目连接:Codeforces 432D Prefixes and Suffixes 题目大意:给出一个字符串,求全部既是前缀串又是后缀串的字符串出现了几次. 解题思路:依据性质能够依据KMP算法求出 ...
- Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes(后缀数组orKMP)
D. Prefixes and Suffixes time limit per test 1 second memory limit per test 256 megabytes input stan ...
- Codeforces 432 D. Prefixes and Suffixes
用扩展KMP做简单省力..... D. Prefixes and Suffixes time limit per test 1 second memory limit per test 256 meg ...
- Codeforces 1092C Prefixes and Suffixes(思维)
题目链接:Prefixes and Suffixes 题意:给定未知字符串长度n,给出2n-2个字符串,其中n-1个为未知字符串的前缀(n-1个字符串长度从1到n-1),另外n-1个为未知字符串的后缀 ...
- CodeForces Round #527 (Div3) C. Prefixes and Suffixes
http://codeforces.com/contest/1092/problem/C Ivan wants to play a game with you. He picked some stri ...
- Codeforces 432D Prefixes and Suffixes kmp
手动转田神的大作:http://blog.csdn.net/tc_to_top/article/details/38793973 D. Prefixes and Suffixes time limit ...
- Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes
D. Prefixes and Suffixes You have a string s = s ...
随机推荐
- 关于ruby重构的过程中去除不必要的format
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) #这段话可以由下面的话替代56 respond_to do |format|57 ...
- Apache VirtualHost配置
转载:http://www.cnblogs.com/wpjsolo/archive/2012/01/19/2327457.html 以lampp环境为例子,其他环境只是配置文件的路径不同. 先要在 ...
- Mysql函数集合
Mysql提供了很多函数 提供的常用函数集合 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整 ...
- JAVA程序1,1,2,3,5,8,13,21....第30个是什么...?
解题思路:从第3个数字开始,后一个数字是前2个数字的和public class text{ public static void main(String[] args) { int num1=1,nu ...
- Python OpenSource Project
http://www.oschina.net/project/lang/25/python
- 关于https和数字证书的一些必须知识
下面这篇文章叫做 HTTPS连接的前几毫秒发生了什么 ,是一篇译文,写得不错,十分有助于理解https. http://blog.jobbole.com/48369/ 下面的链接是百度文库的 数字证 ...
- Ubuntu 12.10 安装 jdk-7u10-linux-x64.tar.gz(转载)
在Ubuntu 12.10下安装 jdk-7u10-linux-x64.tar.gz 总的原则:将jdk-7u10-linux-x64.tar.gz压缩包解压至/usr/lib/jdk,设置jdk环境 ...
- Android之查看网络图片和网页HTML
网络编程是Android应用中很重要的一部分,本文主要讲述了利用HttpURLConnection获取网络图片和HTML的方法. 获取网络图片 public class MainActivity ex ...
- ASP.NET Web API 2 中的属性路由使用(转载)
转载地址:ASP.NET Web API 2 中的属性路由使用
- android开发时,finish()跟System.exit(0)的区别
这两天在弄Android,遇到一个问题:所开发的小游戏中有背景音乐,玩的过程中始终有音乐在放着,然后在我退出游戏后,音乐还在播放! 我看了一下我最开始写的退出游戏的代码,就是简单的finish() ...