ZR提高失恋测4

ZR提高失恋测4

比赛链接

A

(方便讨论,设读入的串为\(S,T\)答案串为\(A\))

首先\(*\)只会有一个

这是这道题目中非常重要的一个结论

简单证明一下?

因为\(*\)可以代表所有的字符串,所以一个\(*\)肯定是可以满足第一个和第二个限制

我们只需要在满足这两个限制的基础上再去尽量满足其他的限制就好了

所以我们接下来只讨论最终答案中会存在\(*\)的情况(不存在\(*\)的情况比较简单,特判掉就好)

接下来考虑如何使得长度最长

首先我们设\(sum_S,sum_T\)分别表示两个串中\(*\)的数量

长度最长只可能是\(\max(len_S - sum_S,len_T - sum_T) + 1\)(因为\(*\)可能是空串)

而且最长长度一定是可以达到的

如何使得问号数量最少?

我们考虑,因为\(*\)只有一个,而且答案的长度为\(l(l = \max(len_S - sum_S,len_T - sum_T) + 1\)

那么我们考虑枚举\(*\)的位置\(i\)

那么答案串的前 \(i - 1\)位一定能够和\(S\)的前\(i - 1\)位和\(T\)的前\(i - 1\)位匹配

如何匹配前缀?

首先能够匹配的大前提下是之前没有出现过\(*\)

一旦出现\(*\),之后的匹配的对应部分应该全是\(?\)(因为\(*\)不定长)

(注意我们这里的匹配只是为了寻找问号个数,并不是最终的\(A\))

比如说

\[a*b\\ aab\\ \]

前缀匹配应该是\(a??\)

因为后面一定存在我们枚举的\(*\)的位置,所以不要担心上面的\(*\)无法匹配

我们这里只是简单讨论一下如何寻找问号的数量

所以这样我们就能够简单处理出每个前缀对应的问号的贡献

同理我们还要对串进行后缀匹配,处理方式相同

\[a*b\\ aab \]

的后缀匹配是\(??b\)

我们现在可以快速的计算出每个前缀和后缀的\(?\)的数量

\(i\)\(*\)\(?\)数量就是\(pre_{i - 1} + suf_{i + 1}\)

所以我们就可以在保证问号数量最少的时候同时保证字典序最小

代码

B

首先,还是那个非常常用的结论

一个数的质因子个数不会大多

\(10^6\)的数最多有\(7\)个质因子

所以还是考虑没一个质因子的贡献

我们对序列

把包含这个质因子的地方看做\(1\),否则看做\(-1\)

一个区间\([l,r]\)合法,当且仅当

\(S_{r} - S_{l - 1} \ge 0\)(\(S\)是前缀和,这还是比较明显的)

然后我们可以得到一个比较简单的做法

暴力枚举区间check

然后有一个小优化

我们枚举质因子只需要枚举\(\le \sqrt{w_i}\)

剩下的如果存在在单独枚举

这样时间复杂度为\(n^3\)(但是跑不满)所以可以通过1000

接下来想想,我们这个做法没有用到一个数最多贡献\(7\)次这个条件

这就提示着我们要只考虑包含这些质因子的位置

因为所有质因子做法相同,这里只考虑一个质因子

我们设\(p_i\)表示包含这个质因子的第\(i\)个位置(从小到大排序之后的)

之后发现

其实一个区间合法的本质是这个区间内包含这个质因子的数的个数要大于等于不包含这个质因子的数的个数

我们二分一个答案\(mid\)判断是否存在长度大于等于mid的区间

那么对于\(p_i\)有贡献的点\(j\)一定满足\(i - \lceil\frac{ mid }{2}\rceil \ge j\)

之后还要满足\(S_{p_i} - S_{p_j - 1} >=0\)

所以我们要类似单调队列那样维护\([1,i - \lceil\frac{ mid }{2}\rceil]\)\(S_{p_j - 1}\)的最小值即可

每次尝试寻找合法解

代码

posted @ 2019-09-24 21:42  wyxdrqcccc  阅读(162)  评论(0编辑  收藏  举报