【BZOJ4212】神牛的养成计划 Trie树+可持久化Trie树
【BZOJ4212】神牛的养成计划
Description
Input
Output
Sample Input
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
7
3
5
5
1
3
5
10
4
HINT
题解:对于前缀的要求,我们可以直接构建一棵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树的更多相关文章
- [BZOJ4212]神牛的养成计划
[BZOJ4212]神牛的养成计划 试题描述 Hzwer 成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神 ...
- BZOJ4212 神牛的养成计划 (字典树,bitset)
题面 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望- 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了, ...
- 【BZOJ-4212】神牛的养成计划 Trie树 + 可持久化Trie树
4212: 神牛的养成计划 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 136 Solved: 27[Submit][Status][Discus ...
- BZOJ 4212: 神牛的养成计划
4212: 神牛的养成计划 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 142 Solved: 30[Submit][Status][Discus ...
- 4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树
很容易的一道题目.大概.不过我空间计算失误MLE了 我草草的计算了一下没想到GG了. 关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了. 题目没有明确指出 在任意时刻数组长度为有限制什么 ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- [BZOJ 4771]七彩树(可持久化线段树+树上差分)
[BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...
- BZOJ.4212.神牛的养成计划(Trie 可持久化Trie)
BZOJ 为啥hzw的题也是权限题啊 考虑能够匹配\(s1\)这一前缀的串有哪些性质.对所有串排序,能发现可以匹配\(s1\)的是一段区间,可以建一棵\(Trie\)求出来,设为\([l,r]\). ...
- BZOJ4477[Jsoi2015]字符串树——可持久化trie树
题目描述 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子.[问题描述]字符串树本质上还是一棵树,即N个节点N ...
随机推荐
- Python Challenge 第十四关
14关页面上是两张图,一张是一个卷面包,一张类似条形码的东西.没任何提示,就看源代码,果然,有一行注释: <!-- remember: 100*100 = (100+99+99+98) + (. ...
- Java IO 学习(零)概述
参考文献 Doug Lea的 <Scalable IO in Java> Java NIO trick and trap IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇) 网络编程释疑 ...
- autofac 用法总结
autofac官网: http://autofaccn.readthedocs.io/en/latest/getting-started/index.html autofac作为一个热门ioc框架,还 ...
- ansible 通过网络下载和上传文件
1.通过http下载文件,并且不验证证书 - name: download files by https get_url: url: https://robin.org.cn/test.zip des ...
- 2016集训测试赛(二十四)Problem C: 棋盘控制
Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\ ...
- 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)
AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...
- Cannot create JDBC driver of class '' for connect URL 'null'问题解决方法2
1)启动Tomcat服务器,打开浏览器,输入http://localhost:8080/admin(其中localhost是名称服务器或称为主机),进入管理界面的登陆页面,这时候请输入原来安装时要求输 ...
- Node.js自动化技术实现(Java)
Node.js自动化测试框架(NodeTestFramework):
- hibernate映射排序
@OneToMany(mappedBy="member") @OrderBy(value = "TousuID desc")
- vue install 注册组件
1.myPlugin.js文件 let MyPlugin = {}; MyPlugin.install = function (Vue, options) { // 1. 添加全局方法或属性 Vue. ...