Jzoj3351 神牛养成计划2

LOJ10151. 「一本通 5.1 练习 2」分离与合体【区间DP+BFS】 【题目描述】 经过在机房里数日的切磋,LYD 从杜神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试…… 杜神牛造了 nn 个区域,他们紧邻着排成一行,编号 1…n1…n。在每个区域里都放着一把 OI 界的金钥匙,每一把都有一定的价值,LYD 当然想得到他们了。然而杜神牛规定 LYD 不能一下子把他们全部拿走,而是每次只可以拿一把。为了尽快得到所有金钥匙,LYD 自然就用上了刚学的分离与合体特... 阅读详情

前文再续,书接上回,话说神牛yxr成功培育出神牛细胞,可最终培育出来的生物体却让他大失所望……

后来,他从某GD女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了,神牛yxr很生气,但他知道基因突变有低频性,说不定还有一些优秀基因没有突变,那么他就可以用限制性核酸内切酶把它们切出来,然后再构建基因表达载体什么的,后面的你懂的。

神牛yxr现在知道了N个细胞的DNA序列,它们是若干个由小写字母组成的字符串(为什么不是ATCG,因为突变得太厉害)。一个优秀基因是两个字符串s1和s2,当且仅当s1是某序列的前缀同时s2是这个序列的后缀时,神牛yxr认为这个序列拥有这个优秀基因。

现在神牛yxr知道了M个优秀基因的s1和s2,他想知道对于给定的优秀基因,有多少个细胞的DNA序列拥有它。


题意就是求有多少个串前缀是s1后缀是s2

用SAM不太方便,hash也不太好搞

那么我们考虑一下用Trie

我们先将所有的DNA序列插入到Trie中

那么显然,一次查询我们可以视为查Trie上一个子树有多少串满足后缀是s2

考虑对每个串按照在Trie中的顺序标号,再将每个串反过来插到另一个trie上面

显然拥有同一个前缀的串,编号是连续的,拥有同一个后缀的串在一个子树中

那么问题就变成了,在第二个Trie的一个子树中查找编号在[l,r]的方案个数

可以用一个dfs序加上主席树完成

(p.s这种数据结构题还是比较好打的毕竟思路清晰不易错)

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<bitset>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 2010
#define M 2000010
#define mid (l+r>>1)
using namespace std;
struct tree{ int l,r,s; } s[N<<4];
int n,m,cnt=0,tot=0,l[M<<1],r[M<<1],son[M<<1][26],c[M<<1];
int sa[N],rk[N],clk=0,r1,r2,wl[M<<1],wr[M<<1],d[M],rt[M],L[N]; char str[M+N],q[M];
inline char* insert(char* s,int x,int p){
	for(;*s;++s)
		x=son[x][*s-'a']?son[x][*s-'a']:son[x][*s-'a']=++cnt;
	c[x]=p; return --s;
}
inline void dfs(int x){
	if(c[x]){
		sa[++clk]=c[x]; rk[c[x]]=clk; l[x]=r[x]=clk;
	} else l[x]=n;
	for(int j=0;j<26;++j)
		if(son[x][j]){
			dfs(son[x][j]);
			l[x]=min(l[x],l[son[x][j]]);
			r[x]=max(r[x],r[son[x][j]]);
		}
}
inline void rinsert(char* s,int x,int p){
	for(;*s;--s)
		x=son[x][*s-'a']?son[x][*s-'a']:son[x][*s-'a']=++cnt;
	c[x]=p;
}
inline void dfs2(int x){
	wl[x]=++clk; d[clk]=c[x];
	for(int j=0;j<26;++j)
		if(son[x][j]) dfs2(son[x][j]);
	wr[x]=clk;
}
inline void ins(int l,int r,int r1,int& r2,int k){
	r2=++tot; s[r2].s=s[r1].s+1;
	if(l==r) return;
	if(k<=mid){ s[r2].r=s[r1].r; ins(l,mid,s[r1].l,s[r2].l,k); }
		else{ s[r2].l=s[r1].l; ins(mid+1,r,s[r1].r,s[r2].r,k); }
}
inline int g(int x,char* s,int lst){
	for(;*s;++s)
		x=son[x][(*s-'a'+lst)%26];
	return x;
}
inline int query(int l,int r,int r1,int r2,int k){
	if(l==r) return 0;
	if(k<=mid) return query(l,mid,s[r1].l,s[r2].l,k);
	else return s[s[r2].l].s-s[s[r1].l].s+query(mid+1,r,s[r1].r,s[r2].r,k);
}
int main(){
	scanf("%d",&n); r1=++cnt; r2=++cnt;
	for(int i=1,x;i<=n;++i){
		scanf("%s",str+L[i]);
		x=strlen(str+L[i])+1; L[i+1]=L[i]+x;
		insert(str+L[i],r1,i);
	}
	dfs(r1); clk=0;
	for(int i=1;i<=n;++i)
		rinsert(str+L[i+1]-2,r2,rk[i]);
	dfs2(r2); ++n;
	for(int i=1;i<=clk;++i)
		if(!d[i]) rt[i]=rt[i-1]; 
			else ins(1,n,rt[i-1],rt[i],d[i]);
	scanf("%d",&m);
	for(int x,y,lst=0;m--;){
		scanf("%s",q);
		x=g(r1,q,lst);
		scanf("%s",q); y=strlen(q); reverse(q,q+y);
		y=g(r2,q,lst);
		lst=query(1,n,rt[wl[y]-1],rt[wr[y]],r[x]+1)-query(1,n,rt[wl[y]-1],rt[wr[y]],l[x]);
		printf("%d\n",lst);
	}
}

区间动态规划考试反思总结——颜色联通块 分离与合体 括号涂色 引子: 额~今天我们昨天才学了区间DP, 还没来得及复习就迎来了老师最喜欢的——我们最喜欢的模拟考试。但是,好像题已经超乎了我的想象。 啊啊啊啊啊啊啊啊啊!!! 后面两道没怎么读懂题啊! First One— 颜色联通块 题目描述: N 个方块排成一排,第 i 个颜色为 Ci 。定义一个颜色联通块 [l,r] 当且仅当 l 和 r 之间(包括l,r)所有方块的颜色相同。 例如 [3,3,3] 有 1 个颜色联通块,[5,2,4,4] 有 3 个颜色联通块。 现在你可以选定一个起始位置 p ,每次将 p 所在 阅读详情

相关推荐

高速窄脉冲峰值保持设计

一、目的 在激光探测领域,探测器发出的高速窄脉冲,单片机AD进行采样,很难捕捉到窄脉冲的幅值,即使使用高速AD进行采样,也存在一定的难度。因此,本方案设计了一种高速窄脉冲峰值保持电路,有助于单片机AD采样能很好的捕捉到脉冲幅值。 二、方案分析与比较 峰值保持器一般分为两种:电压型和跨导型。 方案一:电压型峰值保持器,由电压型运放、二极管、保持电容、缓冲器组成,优点是元件成本低,缺点是峰值保持存在过...

weixin_43184208的博客 9292

bzoj 4212: 神牛的养成计划 (trie+可持久化trie)

4212: 神牛的养成计划 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 112  Solved: 25 [Submit][Status][Discuss] Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先

clover_hxy的博客 897

F5 Shape盾JSVMP核心检测点与无限并发Header生成实战(TikTok/航司)

本文深入剖析了F5 Shape盾结合JSVMP技术的核心风控机制,详细解读了其针对浏览器指纹、行为时序等多维度的检测逻辑。通过实战案例,分享了如何通过逆向分析、精准Hook关键检测点,并构建稳定、高并发的请求Header生成方案,以应对TikTok、航司等平台的高级反爬挑战。

weixin_29325007的博客 1012

一本通1573分离与合体

1573:分离与合体 时间限制: 1000 ms 内存限制: 524288 KB 题目描述 经过在机房里数日的切磋,LYD 从杜神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试…… 杜神牛造了n个区域,他们紧邻着排成一行,编号1..n。在每个区域里都放着一把 OI 界的金钥匙,每一把都有一定的价值,LYD 当然想得到他们了。然而杜神牛规定 LYD...

weixin_30338481的博客 364

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

uniapp - 实现移动端H5微信公众号网页内置浏览器中预览和下载word文档(doc)、excel表格(xls)、ppt文稿、pdf文档等文件,微信内部打开预览和下载到本地详教程,兼容安卓苹果手机

uni-app,微信公众号,h5,移动端,web平台端,网页,网站,Uniapp微信公众号H5网站,内置浏览器下载文档,如何在微信浏览器中预览office文件,word文档,excel文档,pdf文档,ppt文档,office,微信内置浏览器下载文件,下载文件,在微信浏览器里面实现下载任意文件,H5需要在微信浏览器中下载excel文件,UniApp实现网页在微信内置浏览器中下载文件详细教程,安卓点击下载会提示打开浏览器,后端返回流文件,如何解决无法下载文件,跳转至浏览器下载文件,发送到电脑微信,安卓,苹果,

🏆 前端领域优质创作者 1万+

【BZOJ4212】神牛的养成计划

题意: Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了,神牛hzwer很生气,但他知道基因突变的低频性,说不定还有以下优秀基因没有突变,那么他就可以用限制性核酸内切酶把它们切出来,然后再构建基因表达载体什么的,后面你懂的.........

weixin_30301449的博客 207

目标跟踪与视频时序分析基础

两帧均有目标,却因快速移动导致检测框无重叠,仅靠交并比(IoU)无法维持身份关联。本文通过手算与纯Python实现最小跟踪流程,揭示IoU仅为位置线索,不能应对快速位移或遮挡。实验表明,即使目标真实存在,低重叠也会触发新编号。强调跟踪需结合运动预测、外观特征与阈值验证,避免误判。

Mr数据杨 2335

JZOJ 3351.【NOI2013模拟】神牛养成计划2

可持久化Trie

Luckfort 346

华为OD面试八股真题 - 操作系统 - 1

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 1634

基于simulink创建一个针对双馈异步风力发电机并网运行的仿真模型

摘要:本文详细介绍了基于Simulink的双馈异步风力发电机(DFIG)并网运行仿真建模方法。系统包含风速输入、风力机、双馈发电机、电力电子变换器、控制器和并网接口等模块,通过8个步骤完整呈现了建模流程,包括风速模拟、机械功率计算、发电机特性建模、变流器控制策略设计等关键环节。仿真可评估系统在不同风速条件下的动态响应、最大功率跟踪能力和发电效率,为风力发电系统的优化设计提供有效验证手段。模型可根据实际需求扩展环境因素和电网交互等细节,提高仿真精度。

amy_mhd的博客 333

2017,11,12月题目小结

最近没什么时间写博客,但还是要写点小结,加强印象。JZOJ4384 hashit后缀平衡树,注意重量平衡树的维护根,删除可以直接拉到叶子删掉。11.25清华集训这套比赛打的时候不严谨,要注意推式子时下标一定要检查好,不然很浪费时间。导致策略无法进行。jzoj5480.【清华冬令营2018模拟】第一题给一个一些位置不确定的数字n,求合法的数字,满足s_d(a)+s_d(b)=s_d(n) 发现a+b

ZLTJohn的博客 716

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【JZOJ4860】【NOIP2016提高A组集训第7场11.4】分解数

题目描述Dpstr学习了动态规划的技巧以后,对数的分解问题十分感兴趣。 Dpstr用此过程将一个正整数x分解成若干个数的乘积:一开始令集合A中只有一个元素x,每次分解时从A中取一个元素a并找出两个大于1且互质的整数p,q,要求pq=a,然后将a分解成两个元素p和q,也就是从A中删去a并加入p和q。Dpstr把正整数x用该过程能分解的次数的最大值称为x的分解数。 例如66的分解数为2,因为最多分解

=w= 324

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

做题太消极了

DD(XYX)的硫氰化氘博客 312

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Bzoj4212--神牛养成计划

正规题解传送门 :https://zyqn.tech/?p=3163 但是我们发现n只有2000,于是可以建出trie树然后愉快的bitset去搞。 直接对于trie上每个节点开个bitset空间爆炸。但是有很多是重复的,所以我们想虚树一样建,每个节点只存一个link指针。 代码 : #include<bits/stdc++.h> #define INF 0x3f...

weixin_30505043的博客 194

4212: 神牛的养成计划

4212: 神牛的养成计划 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 86  Solved: 20 [Submit][Status][Discuss] Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望...... 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决

CRZbulabula的博客 647

BZOJ4212 神牛的养成计划

题目大意 给定$n$个字符串$S$,$m$次询问,每次询问给定两个字符串$s_1,s_2$,求$n$个字符串中有多少个串满足$s_1$是其前缀且$s_2$是其后缀。 $n\leq 2000,m\leq 10^5 \sum |S|,\sum (|s_1|+|s_2|) \leq 2\times 10^6$ 题解 考虑正反建$Trie$树,原题就变为了在两棵子树中均出现的点有多少个。 ...

weixin_30699831的博客 150

【DP】【递归】分离与合体

分离与合体 题目大意: 有n个区域,可以把它们分为两个区间,结果加上左边区间的最左区域的数和最右区域的数还有右边区间的最右区域的数,就这样不停分,使结果最大,并输出各分界线的位置(按1/2,2/4,4/8的顺序)

ssllyf的博客 920

jzoj2573 序列

题目大概给一个长度为N的序列,请删除尽量少的数,使得新序列中满足第I个数为I条件的数最多。Input第一行有一个正整数N。 第二行有N个正整数Ai,表示原序列中第I个数为Ai。Output只有一个整数ANS,表示最多能有多少个数满足条件。解法首先不难发现,i-ai<0的数是肯定不能归位的,然后我们忽略他. 最直观的一个想法就是动态规划,设fi,jfi,j为在原序列第i个位置,删了j个数的最大收益

一位蒟蒻的小博客 789

分离与合体

题目描述 经过在机房里数日的切磋,LYD 从杜神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试…… 杜神牛造了 个区域,他们紧邻着排成一行,编号 。在每个区域里都放着一把 OI 界的金钥匙,每一把都有一定的价值,LYD 当然想得到他们了。然而杜神牛规定 LYD 不能一下子把他们全部拿走,而是每次只可以拿一把。为了尽快得到所有金钥匙,LYD 自然就用上了刚学的分离与合体特技。 一开始 LYD 可以选择 中的任何一个区域进入,我们不妨把这个区域记为 。进入后 LYD 会在 区域发生分离,从而分离成两

Gank_Wind的博客 349

【题解】分离与合体

题目描述 经过在机房里数日的切磋,LYD 从杜神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试…… 杜神牛造了nnn个区域,他们紧邻着排成一行,编号 。在每个区域里都放着一把 OI 界的金钥匙,每一把都有一定的价值,LYD 当然想得到他们了。然而杜神牛规定 LYD 不能一下子把他们全部拿走,而是每次只可以拿一把。为了尽快得到所有金钥匙,LYD 自然就用上了刚学的分离与合体特技。 一开始 LYD 可以选择 中的任何一

tanfuwen_的博客 1621
上一篇: Jzoj5622 table
下一篇: Jzoj5662 尺树寸泓
扩展的灰
博客等级 码龄12年 60粉丝 342原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值