【BZOJ-4212】神牛的养成计划 Trie树 + 可持久化Trie树
4212: 神牛的养成计划
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 136 Solved: 27
[Submit][Status][Discuss]
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
Source
Solution
首先对所有串按字典序排序,按字典序正序建Trie树,并在Trie树上记录节点区间。
然后查询一个前缀,在Trie树上跑到的节点所包含的区间即是可能成为答案的串区间,由于之前的排序,所以区间一定连续。
然后逆序建可持久化Trie树,对于前缀得到的区间LR,再利用可持久化Trie树跑后缀得到满足的子串树。
复杂度O(LenlogLen)排序暴力比较貌似有点智障,把垃圾排序去掉能做到$O(Len)$。
Code
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<cstdio>
using namespace std; #define MAXN 2000010 int N,M,id[MAXN],last,st[2010],ed[2010];
char S[MAXN],s1[MAXN],s2[MAXN]; inline bool cmp(int x,int y)
{
int st1=st[x],st2=st[y],ed1=ed[x],ed2=ed[y],l=min(ed1-st1,ed2-st2)+1;
for (int i=1; i<=l; i++) {
if (S[st1]==S[st2]) st1++,st2++;
else return S[st1]<S[st2];
}
return ed1-st1<ed2-st2;
} namespace Trie{ int ls[MAXN],rs[MAXN],sz=1,son[MAXN][26];
inline void Insert(int x,int y)
{
int now=1;
for (int i=st[x]; i<=ed[x]; i++) {
int c=S[i]-'a';
if (son[now][c]) now=son[now][c];
else son[now][c]=++sz,now=son[now][c];
ls[now]=min(ls[now],y);
rs[now]=max(rs[now],y);
} } inline int Query()
{
int len=strlen(s1),now=1;
for (int i=0; i<len; i++) {
int c=s1[i]-'a';
if (!son[now][c]) return -1;
now=son[now][c];
}
return now;
} inline void Clear() {memset(ls,63,sizeof(ls)); memset(rs,0,sizeof(rs));} } namespace PrTrie{
int root[MAXN+20010],sz,sum[MAXN+20010],son[MAXN+20010][26];
inline void Insert(int &x,int y,int k)
{
int now=x=++sz;
for (int i=st[k]; i<=ed[k]; i++) {
for (int j=0; j<26; j++) son[now][j]=son[y][j];
sum[now]=sum[y]+1;
int c=S[i]-'a';
y=son[y][c],son[now][c]=++sz,now=son[now][c];
}
sum[now]=sum[y]+1;
} inline int Query(int L,int R)
{
int len=strlen(s2),re=0;;
for (int i=0; i<len; i++) {
int c=s2[i]-'a';
if (sum[son[R][c]]-sum[son[L][c]])
L=son[L][c],R=son[R][c];
else return 0;
}
return sum[R]-sum[L];
} } int main()
{
// freopen("godcow.in","r",stdin);
// freopen("godcow.out","w",stdout); scanf("%d",&N);
for (int i=1; i<=N; i++) {
scanf("%s",S+ed[i-1]+1); id[i]=i;
st[i]=ed[i-1]+1; ed[i]=st[i]+strlen(S+ed[i-1]+1)-1;
} stable_sort(id+1,id+N+1,cmp); // for (int i=1; i<=N; i++) cout<<id[i]<<" "; cout<<endl; Trie::Clear(); for (int i=1; i<=N; i++) Trie::Insert(id[i],i); for (int i=1; i<=N; i++) reverse(S+st[i],S+ed[i]+1); for (int i=1; i<=N; i++) {
using namespace PrTrie; Insert(root[i],root[i-1],id[i]);
} scanf("%d",&M); while (M--) {
scanf("%s%s",s1,s2);
int l1=strlen(s1),l2=strlen(s2);
for (int i=0; i<l1; i++) {
int tmp=s1[i]-'a'; tmp+=last; tmp%=26; tmp+='a';
s1[i]=tmp;
}
for (int i=0; i<l2; i++) {
int tmp=s2[i]-'a'; tmp+=last; tmp%=26; tmp+='a';
s2[i]=tmp;
}
reverse(s2,s2+l2);
int pos=Trie::Query(),L,R;
if (pos==-1) printf("%d\n",last=0);
else {
L=Trie::ls[pos],R=Trie::rs[pos];
// printf("%d %d\n",L,R);
using namespace PrTrie;
printf("%d\n",last=Query(root[L-1],root[R]));
}
}
return 0;
}
用cout输出一直无故RE...黑人问号...
【BZOJ-4212】神牛的养成计划 Trie树 + 可持久化Trie树的更多相关文章
- BZOJ 4212: 神牛的养成计划
4212: 神牛的养成计划 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 142 Solved: 30[Submit][Status][Discus ...
- BZOJ.4212.神牛的养成计划(Trie 可持久化Trie)
BZOJ 为啥hzw的题也是权限题啊 考虑能够匹配\(s1\)这一前缀的串有哪些性质.对所有串排序,能发现可以匹配\(s1\)的是一段区间,可以建一棵\(Trie\)求出来,设为\([l,r]\). ...
- BZOJ 4212: 神牛的养成计划 可持久化trie+trie
思路倒是不难,但是这题卡常啊 ~ code: #include <bits/stdc++.h> #define N 2000004 #define M 1000005 #define SI ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...
- 【BZOJ4212】神牛的养成计划 Trie树+可持久化Trie树
[BZOJ4212]神牛的养成计划 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变 ...
- [BZOJ4212]神牛的养成计划
[BZOJ4212]神牛的养成计划 试题描述 Hzwer 成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神 ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||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] ...
- 4.24 省选模拟赛 欧珀瑞特 主席树 可持久化trie树
很容易的一道题目.大概.不过我空间计算失误MLE了 我草草的计算了一下没想到GG了. 关键的是 我学了一个dalao的空间回收的方法 但是弄巧成拙了. 题目没有明确指出 在任意时刻数组长度为有限制什么 ...
随机推荐
- CSS 设置网页中选中文字的背景色
在样式文件中增加如下代码: ::selection { background: hsla(5, 92%, 76%, 0.8); color: #fff;}
- livereload使用方法
搞这个自动刷新的插件搞了好几个小时了还没搞明白,快被气死了,想改用browser-sync结果npm又一直转啊转一直卡死. 刚才终于神奇地搞定了,结果发现还是我自己智商太低...大概的经过是这样的.. ...
- CSS那些事!这个篇幅是我特意开的,不是因为帮助小菜之类的,而是在多人的团队配合中各种命名冲突的规范让人蛋疼
CSS那些事!这个篇幅是我特意开的,不是因为帮助小菜之类的,而是在多人的团队配合中各种命名冲突的规范让人蛋疼. css这个东西只要不是新的离谱都会写,但是每个人的命名风格,方法,都不同 有人喜欢驼峰, ...
- 日常训练赛 Problem C – Complete Naebbirac’s sequence
比赛链接https://vjudge.net/contest/256988#status/17111202012/C/0/ 大意:三个操作,使得输入的数中,从1-n,每一个数出现的次数相同. wa代码 ...
- Nagios配置文件nagios.cfg详解
这里开始要讲一些Nagios的配置. 首先要看看目前Nagios的主配置路径下有哪些文件.[root@nagios etc]# ll总用量 152-rwxrwxr-x. 1 nagios nagios ...
- 新手学习爬虫之创建第一个完整的scrapy工程-糗事百科
创建第一个scrapy工程-糗事百科 最近不少小伙伴儿,问我关于scrapy如何设置headers的问题,时间久了不怎么用,还真有的忘,全靠记忆去写了,为了方便大家参考,也方便我以后的查阅,这篇文章就 ...
- selnium远程机上传图片遇到的坑
一般上传图片方法采取方案如下: input标签的file类型上传图片,使用对象的sendkeys+路径方法 使用js注入,再用使用对象的sendkeys+路径方法 使用autolt生成的exe,打开对 ...
- 重温CSS之文档结构
我们来看看几个基本的HTML页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- redis配置文件redis.conf翻译、解释以及常用注意事项(持续更新中...)
# Redis configuration file example. #Redis 配置文件的示例 #如何利用配置文件启动Redis # Note that in order to read the ...
- IntelliJ IDEA快捷键:F12
The F12 key moves the focus from the editor to the last focused tool window. 将焦点从编辑器移动到最后一个聚焦的工具窗口.