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

题目大意

给定一些字符串,集合为S,( |S|2000 )给出m组询问 m200000
每组询问有2个串s1,s2,问在S中有几个字符串满足以下的要求:s1为之前缀,s2为之后缀。
强制在线。

题解

题目条件

①S中的字符固定
②强制在线
③要问两个集合的交集(什么是两个集合这很显然)
④s1是第一个集合里面的字符串的前缀,s2是第二个集合里面的字符串的后缀。

突破口

综合条件①④,按照S来建Trie。
根据条件④,可以得出如果S中的串有序,那么满足④中第一个条件的一定在一个区间[l1,r1]内。第二个条件同理。
综合条件②③,需要用到可持久化数据结构。

具体解法

①按照字符串排序,得到排名L1[i],R1[i]。
②正着和反着各建一棵Trie,那么Trie上的点显然可以表示选择的字符串的一个区间
③强制在线询问,那么第r棵树-第l-1棵树的值就能够表示这一边排名为[l,r]的另外一边的排名的个数。

心得

①在打码农题之前,一定先写好框架,然后再打程序。
②原始快排中,mid是个定值,不能更改,在qsort中的主循环中也如此。
③主席树等数据结构码速有待提高。
总的来说,打这题花的时间很多,但是调这题用时很少,不错。
听说还有字符串哈希解法(想到这个那么做起来更显然了,时间复杂度乍一看 O(nlog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值