5.7晚
NO.1 来源: BZOJ 4565 [Haoi2016]字符合并
分类: 区间,状压 dp
简要题解:
- 注意到长度为 len 的01串最后会被合并成长为 x=(len−1) mod (k−1)+1 的01串。
- 设
f(i,j,S)
表示区间
[i,j]
的01串最后变成二进制状态
S
的最大得分。讨论
S 的第一个字符由那些合并而来,那么f(i,j,S)←f(i,t,first)+f(t+1,j,S−first) (t≡ i mod(k−1))
特别的,当 x=1或x=k 的时候 f(i,j,to(S))←f(i,j,S)+w(S)
反思
- 状态还是很好想到,关键是抓住什么来转移。发现长度的性质其实很有用。
- 思路有点像合并石子,只是不知道高到哪里去了。
5.8晚
NO.2 来源:BZOJ 4566 [Haoi2016]找相同字符
分类: 后缀自动机
简要题解:
- 对这两个串建一个广义后缀自动机,每个节点记录 Max,cnt1,cnt2 ,分别表示该节点最长串的长度,第一个字符串的到访次数,第二个字符串的到访次数。
- 维护 cnt1,cnt2 的方法是,每次加入一个字符都在 last 节点上累计次数,最后基数排序之后从下到上累加就行了。
- 最终答案就是
∑(Max[x]−Max[pre[x]])∗cnt1[x]∗cnt2[x]
反思
- 对于字符串的统计为题,后缀自动机是很有力的方法。
- 每个节点要维护什么,最后答案是什么。