思路倒是不难,但是这题卡常啊 ~

code:

#include <bits/stdc++.h>
#define N 2000004
#define M 1000005
#define SIZE 2000005
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
vector<int>G[SIZE];
int n,m,tim,cnt,tot;
char str[SIZE],tmp[SIZE],t1[SIZE],t2[SIZE];
int st[N],ed[N],dfn[N],ch[SIZE][26],ba[SIZE],size[SIZE],ou[SIZE],rt[SIZE],coun[SIZE],trans[SIZE][26];
inline int newnode() { return ++cnt; }
void insert_trie(int l,int r,int id)
{
int now=0;
for(int i=l;i<=r;++i)
{
if(!ch[now][str[i]-'a']) ch[now][str[i]-'a']=++tot;
now=ch[now][str[i]-'a'];
}
G[now].push_back(id);
}
void dfs(int u)
{
dfn[u]=++tim, ba[tim]=u, size[u]=1;
for(int i=0;i<26;++i) if(ch[u][i]) dfs(ch[u][i]),size[u]+=size[ch[u][i]];
ou[u]=tim;
}
void Insert(int id,int pre,int &pos)
{
int i,j,r=ed[id],l=st[id];
int now=pos=newnode();
for(i=r;i>=l;--i)
{
for(j=0;j<26;++j) trans[now][j]=trans[pre][j];
trans[now][str[i]-'a']=newnode();
pre=trans[pre][str[i]-'a'];
now=trans[now][str[i]-'a'];
coun[now]=coun[pre]+1;
}
}
int main()
{
// setIO("input");
int i,j;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
ed[i]=strlen(str+1);
st[i]=strlen(str+1)+1;
scanf("%s",tmp+1);
int len=strlen(tmp+1);
for(j=1;j<=len;++j) str[++ed[i]]=tmp[j];
}
for(i=1;i<=n;++i) insert_trie(st[i],ed[i],i);
dfs(0);
for(i=1;i<=tim;++i)
{
rt[i]=rt[i-1];
for(j=0;j<(int)G[ba[i]].size();++j) Insert(G[ba[i]][j],rt[i],rt[i]);
}
scanf("%d",&m);
int lastans=0;
while(m--)
{
scanf("%s%s",t1+1,t2+1);
int len1=strlen(t1+1),len2=strlen(t2+1),now=0;
for(j=1;j<=len1;++j) t1[j]='a'+(t1[j]-'a'+lastans)%26;
for(j=1;j<=len2;++j) t2[j]='a'+(t2[j]-'a'+lastans)%26;
for(j=1;j<=len1;++j) now=ch[now][t1[j]-'a'];
if(!now) lastans=0,printf("0\n");
else
{
int re=0,l=rt[dfn[now]-1],r=rt[ou[now]];
for(j=len2;j>=1;--j)
{
l=trans[l][t2[j]-'a'];
r=trans[r][t2[j]-'a'];
}
printf("%d\n",lastans=coun[r]-coun[l]);
}
}
return 0;
}

  

BZOJ 4212: 神牛的养成计划 可持久化trie+trie的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ4212】神牛的养成计划 Trie树+可持久化Trie树

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

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

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

  6. 【bzoj4212】神牛的养成计划

    Portal --> bzoj4212 Description ​ 给你\(n\)个字符串,接下来有\(m\)个询问,每个询问由两个给定的字符串\(s_1\)和\(s_2\)组成,对于每个询问输 ...

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

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

  8. BZOJ第1页养成计划

    嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1000   BZOJ1001   BZOJ1002   BZOJ1003   BZOJ1004   BZOJ1005   ...

  9. BZOJ第7页养成计划

    嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1600   BZOJ1601   BZOJ1602   BZOJ1603   BZOJ1604   BZOJ1605   ...

随机推荐

  1. Python入门 .变量 常量 基础数据类型 用户输入 流程控制语句 小练习题

    # 2.name = input(“>>>”)通过代码来验证name变量是什么数据类型?--str name = input(">>>") pr ...

  2. python ---升级所有安装过的package

    # -*- coding:utf8 -*- import pip from subprocess import call from pip._internal.utils.misc import ge ...

  3. Javascript判断参数类型

    function (options, param) { alert(typeof options); if (typeof options == "string") { alert ...

  4. poi读取excel的列和删除列

    (各自根据具体的poi版本进行相应的替换即可) package com.br.loan.strategy.common.utils; import lombok.extern.slf4j.Slf4j; ...

  5. 浏览器Notwork XHR被隐藏了

    图片中红色区域内容被隐藏 解决方式,点击此处

  6. PHP CI框架调试开启报错信息方法

    方法如下三种: 1.php.ini 设置 display_errors = On error_reporting = E_ALL | E_STRICT 2.ci index.php 设置 define ...

  7. java-java技术链接

    java基础知识总结大全:https://blog.csdn.net/hao19980724/article/details/83792516 Java核心技术梳理-集合:https://mp.wei ...

  8. PageRank网页价值算法

    一.简介 PageRank是Google提出的算法,用于衡量特定网页相对于其它网页而言的重要程度.是Google创始人拉里.佩奇和谢尔盖.布林于1997年创造的,用于实现将链接价值概念作为排名的重要因 ...

  9. day 08作业 预科

    有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中 lt=[11,22,3 ...

  10. C++(五十一) — 容器中常见算法(查找、排序、拷贝替换)

    1.find(); find()算法的作用是在指定的一段序列中查找某个数,包含三个参数,前两个参数是表示元素范围的迭代器,第三个参数是要查找的值. 例:fing(vec.begin(), vec.en ...