十二省联考2019做题笔记

异或粽子(可持久化Trie、堆)

超级钢琴+可持久化Trie???HNOI D1T1怎么不出这种送分题啊

代码

字符串问题(SAM、记忆化搜索)

一切字符串问题用SAM就完事了

把原串reverse,这样“某个\(A\)串是前面的\(A\)串支配的\(B\)串的前缀”的条件变成了后缀。而以某个串为后缀的串在SAM的fail树上体现为它的子树。所以我们可以在fail树上,每个点向其儿子连边,对于一个支配关系,\(A\)串对应状态向\(B\)串对应状态连边。这样原图的所有关系就体现为了一张图。判一下环、记搜求一下最长路即可。

注意一点:“\(A\)串对应状态向\(B\)串对应状态连边”有可能会导致当前\(A\)串加入之后,会加入一个长度小于\(B\)串长度,但是和\(B\)串在SAM上处于同一状态的\(A\)串;也有可能存在两个不同的\(A\)串在同一个状态,有可能导致算错贡献。解决的方法就是在连边之前拆SAM上的点,让这两种情况不会出现,也就是让这两种情况对应的串处于不同的状态。

最开始沙雕了,想着对dfn序线段树优化连边,然后常数就大了很多……

代码

骗粉过样例

还没有颓到要养生的地步,所以留坑

皮配(背包)

50pts很简单,设\(dp_{i,j,k}\)表示考虑了前\(i\)个学校,蓝阵营\(j\)人、鸭派系\(k\)人的方案数,同一个学校一起转移。复杂度\(O(TNM^2)\)

对于\(k=0\)的情况,因为选择阵营和选择派系之间是独立的,选择哪个阵营不会影响选择哪个派系,反过来也一样。所以总方案数等于分配派系的方案数×分配阵营的方案数,两个分别背包一下。

当\(k=30\)时,会有\(30\)个城市在选择了阵营之后有某些学校不能选择某一个派系,而没有限制的城市跟\(k=0\)相同。我们可以把这\(30\)个城市单独拿出来做50pts的DP,对于其他的做k=0的DP。

但是如果这\(30\)个城市的人数总和很大,复杂度仍然难以接受。但是注意到:对于有限制的城市中没有限制的学校,选择派系跟选择阵营仍然是无关的,所以并不需要在50pts的暴力做法中记录,而是可以放在k=0的DP中计算贡献。

所以设\(f_{i,j,k}\)表示考虑了前\(i\)个有限制的城市,这些城市的所有学校中选择蓝阵营的人数为\(j\),这些城市有限制的学校中选择鸭派系的人数为\(k\)的方案总数,\(g_{i,j}\)表示考虑了前\(i\)个没有限制的城市,选择蓝阵营的总人数为\(j\)的方案数,\(h_{i,j}\)表示考虑了前\(i\)个没有限制的学校,选择鸭派系的总人数为\(j\)的方案数。

\(f\)的转移先枚举当前城市选择哪一个阵营,再对于有限制的学校考虑选择派系。而有限制的城市中无限制的学校选择派系的贡献则放入了\(h\)中进行计算。

最后统计答案只需要枚举\(f_{i,j,k}\)中的\(j,k\),这样\(g\)和\(h\)的有效转移对应一段区间,前缀和一下。总复杂度\(O(T(10K^2M + NM))\)

代码

上一篇:bzoj 4032: [HEOI2015]最短不公共子串【dp+SAM】


下一篇:bzoj 3998: [TJOI2015]弦论【SA+二分||SAM】