题目大意
给定一些字符串,集合为S,( |S|≤2000 )给出m组询问 m≤200000 。
每组询问有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