【BZOJ4212】神牛的养成计划

Description

Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望......
后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了,神牛hzwer很生气,但他知道基因突变的低频性,说不定还有以下优秀基因没有突变,那么他就可以用限制性核酸内切酶把它们切出来,然后再构建基因表达载体什么的,后面你懂的......
黄学长现在知道了N个细胞的DNA序列,它们是若干个由小写字母组成的字符串。一个优秀的基因是两个字符串s1和s2,当且仅当s1是某序列的前缀的同时,s2是这个序列的后缀时,hzwer认为这个序列拥有这个优秀基因。
现在黄学长知道了M个优秀基因s1和s2,它们想知道对于给定的优秀基因,有多少个细胞的DNA序列拥有它。

Input

第一行:N,表示序列数
接下来N行,每行一个字符串,代表N个DNA序列,它们的总长为L1
接下来一个M,表示询问数
接下来M行,每行两个字符串s1和s2,由一个空格隔开,hzwer希望你能在线回答询问,所以s1等于“s1”的所有字符按字母表的顺序向后移动ans位(字母表是一个环),ans为上一个询问的答案,s2同理。例如ans=2  “s1”=qz
则s1=sb。对于第一个询问,ans=0
s1和s2的总长度为L2

Output

输出M行,每行一个数,第i行的数表示有多少个序列拥有第i个优秀基因。

Sample Input

10
emikuqihgokuhsywlmqemihhpgijkxdukjfmlqlwrpzgwrwozkmlixyxniutssasrriafu
emikuqihgokuookbqaaoyiorpfdetaeduogebnolonaoehthfaypbeiutssasrriafu
emikuqihgokuorocifwwymkcyqevdtglszfzgycbgnpomvlzppwrigowekufjwiiaxniutssasrriafu
emikuqihgokuorociysgfkzpgnotajcfjctjqgjeeiheqrepbpakmlixyxniutssasrriafu
emikuqihgokuorociysgfrhulymdxsqirjrfbngwszuyibuixyxniutssasrriafu
emikuqihgokuorguowwiozcgjetmyokqdrqxzigohiutssasrriafu
emikuqihgokuorociysgsczejjmlbwhandxqwknutzgdmxtiutssasrriafu
emikuqihgokuorociysgvzfcdxdiwdztolopdnboxfvqzfzxtpecxcbrklvtyxniutssasrriafu
emikuqihgokuorocsbtlyuosppxuzkjafbhsayenxsdmkmlixyxniutssasrriafu
emikuqihgokuorociysgfjvaikktsixmhaasbvnsvmkntgmoygfxypktjxjdkliixyxniutssasrriafu
10
emikuqihgokuorociysg yxniutssasrriafu
aiegqmedckgqknky eqpoowonnewbq
xfbdnjbazhdnhkhvb qrqgbnmlltlkkbtyn
bjfhrnfedlhrlolzfv qppxpoofxcr
zhdfpldcbjf stsidponnvnmmdvap
zhdfpldcbjfpjmjxdt gdstsidponnvnmmdvap
dlhjtphgfnjtnqnbhxr wxwmhtsrrzrqqhzet
bjfhrnfedlhrlolzfv frqppxpoofxcr
zhdfpldcbjf dponnvnmmdvap
ucyakgyxweakehes nondykjiiqihhyqvk

Sample Output

4
7
3
5
5
1
3
5
10
4

HINT

N<=2000
L1<=2000000
M<=100000
L2<=2000000

题解:对于前缀的要求,我们可以直接构建一棵Trie树,但是后缀的要求比较难搞。这就需要我们知道Trie树上的每个点被哪些单词所包含,然后判断这些单词的后缀是否满足要求。

这里又用到了DFS序的性质,当我们给所有单词按字典序排序后,Trie树上每个节点的子树里含有的单词 都在一段连续的区间中(Trie树的DFS序上的区间)。我们可以先利用Trie树将所有单词排序,然后求出每个节点对应的区间,再按照DFS序,对每个单词的反串维护一棵可持久化Trie树。这样,我们在查询的时候,只需要将s1在Trie树上跑一边,得到那个点对应的区间,再从可持久化Trie树里将那个区间拿出来,让s2在那里跑一边,看一下最终节点的siz就行了。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxl=2000010;
int n,m,ans;
int rank,tot1,tot2;
int rt[2010],lp[2010],rp[2010];
char str[maxl],s1[maxl],s2[maxl];
struct trie
{
int ch[26],org,ls,rs;
}t1[maxl];
struct ktrie
{
int ch[26],siz;
}t2[maxl];
void insert(int x,int y,int z)
{
rt[y]=++tot2,y=rt[y];
int i,j,a;
for(i=rp[z]-1;i>=lp[z];i--)
{
a=str[i]-'a',t2[y].ch[a]=++tot2;
for(j=0;j<26;j++) if(j!=a) t2[y].ch[j]=t2[x].ch[j];
y=t2[y].ch[a],x=t2[x].ch[a],t2[y].siz=t2[x].siz+1;
}
}
int query(int x,int y)
{
int i,a=strlen(s2),b;
for(i=a-1;i>=0;i--) b=s2[i]-'a',y=t2[y].ch[b],x=t2[x].ch[b];
return t2[y].siz-t2[x].siz;
}
void dfs(int x)
{
t1[x].ls=rank+1;
if(!x) return ;
if(t1[x].org) t1[x].ls=t1[x].rs=++rank,insert(rt[rank-1],rank,t1[x].org);
for(int i=0;i<26;i++) dfs(t1[x].ch[i]);
t1[x].rs=rank;
}
int main()
{
scanf("%d",&n);
int i,j,a,b,u;
tot1=1;
for(i=1;i<=n;i++)
{
lp[i]=rp[i-1],scanf("%s",str+lp[i]),rp[i]=strlen(str);
for(u=1,j=lp[i];j<rp[i];j++)
{
b=str[j]-'a';
if(!t1[u].ch[b]) t1[u].ch[b]=++tot1;
u=t1[u].ch[b];
}
t1[u].org=i;
}
t1[0].ls=1<<30,t1[0].rs=0,dfs(1);
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%s%s",s1,s2),a=strlen(s1),b=strlen(s2),u=1;
for(j=0;j<a;j++) s1[j]=(s1[j]-'a'+ans)%26+'a';
for(j=0;j<b;j++) s2[j]=(s2[j]-'a'+ans)%26+'a';
for(j=0;j<a;j++) u=t1[u].ch[s1[j]-'a'];
if(!u) ans=0;
else ans=query(rt[t1[u].ls-1],rt[t1[u].rs]);
printf("%d\n",ans);
}
return 0;
}

【BZOJ4212】神牛的养成计划 Trie树+可持久化Trie树的更多相关文章

  1. [BZOJ4212]神牛的养成计划

    [BZOJ4212]神牛的养成计划 试题描述 Hzwer 成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神 ...

  2. BZOJ4212 神牛的养成计划 (字典树,bitset)

    题面 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望- 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了, ...

  3. 【BZOJ-4212】神牛的养成计划 Trie树 + 可持久化Trie树

    4212: 神牛的养成计划 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 136  Solved: 27[Submit][Status][Discus ...

  4. BZOJ 4212: 神牛的养成计划

    4212: 神牛的养成计划 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 142  Solved: 30[Submit][Status][Discus ...

  5. 4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树

    很容易的一道题目.大概.不过我空间计算失误MLE了 我草草的计算了一下没想到GG了. 关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了. 题目没有明确指出 在任意时刻数组长度为有限制什么 ...

  6. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  7. [BZOJ 4771]七彩树(可持久化线段树+树上差分)

    [BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...

  8. BZOJ.4212.神牛的养成计划(Trie 可持久化Trie)

    BZOJ 为啥hzw的题也是权限题啊 考虑能够匹配\(s1\)这一前缀的串有哪些性质.对所有串排序,能发现可以匹配\(s1\)的是一段区间,可以建一棵\(Trie\)求出来,设为\([l,r]\). ...

  9. BZOJ4477[Jsoi2015]字符串树——可持久化trie树

    题目描述 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子.[问题描述]字符串树本质上还是一棵树,即N个节点N ...

随机推荐

  1. 如何配置tomcat环境变量

    首先下载tomcat,并且解压到目录: 注意:2,3步的变量值要到下图这一步 即,bin的上一级目录不包含bin 1.第一步鼠标右键计算机->属性->高级系统设置,进去之后,点击环境变量, ...

  2. ie8实现无刷新文件上传

    ie8由于无法使用FormData,想要无刷新上传文件就显得比较麻烦.这里推荐使用jQuery-File-Upload插件,它能够很方便的解决ie8无刷新文件上传问题.(最低兼容到ie6) jQuer ...

  3. Nginx的简单最小安装!

    一.检查安装环境 rpm -qa gcc pcre pcre-devel zlib zlib-devel openssl pcre, 重写rewrite zlib,为了gzip压缩. gcc,c编译器 ...

  4. python 关键词

    一.python关键字   1. and :表示逻辑判断 [与] a = '1' b = 1 if a and b: print('Hello Python') 2.as :单独没有实际意思,常与wi ...

  5. noip2017集训测试赛(六)Problem A: 炮艇大赛之正式赛

    题目描述 给定一个长度为\(L \le 10^9\)的环形赛道, \(n \le 10^5\)个人在上面赛艇. 每个人的速度都不相同, 假如为正则顺时针走, 否则逆时针走. 当两个人相遇时, 他们就会 ...

  6. 打开与关闭eclipse的自动补全功能

    打开: eclipse→Windows→Preferences→Java→Editor→Content Assist:修改Auto Activation triggers for java的值为:.a ...

  7. DEDECMS后台模板修改

    一.后台登录页 dede/templets/login.htm去掉底部的代码(类名为login-power.dede-iframe这两个div都要去掉)其中“login.php?dopost=show ...

  8. JavDroider的作品展示

    好久没有写博客了,很懊悔,尽管说实习和项目那边的任务有点多,可是我想每天抽出时间出来写一篇文章总结一下当天所习所得并不困难! 好了,今天以一篇个人作品介绍来又一次开启我的博客~ 实习单位的门户站点 一 ...

  9. JAVA Eclipse如何安装Swing

    查看自己的Eclipse版本   打开WINDOWBUILDER的下载页面,找到自己对应版本的下载地址,注意只是一个下载地址,不是要下载东西 http://www.eclipse.org/window ...

  10. Android世界第一个activity启动过程

    Android世界第一个activity启动过程 第一次使用Markdown,感觉不错. Android系统从按下开机键一直到launcher的出现,是一个如何的过程,中间都做出了什么操作呢.带着这些 ...