序列计数
对于一个小写字母的序列每次可以将相邻两个不同的小写字母都变为二者之一,可以进行无限次这样的操作,求解可以产生多少种不同的序列。
首先我们不能考虑操作,而是考虑合法序列,显然最后会形成若干个区间,然后每个区间必然是对应了最初的一个位置,并且需要满足位置的相对顺序不变,所以问题等价于统计本质不同的满足相邻字符不同的子序列个数,然后利用组合数直接计算。
那么考虑动态规划,如果采用求子序列个数的dp,发现无法很好处理相邻字符不同,但是如果利用子序列自动机,就很好处理,这样dpi,jdp_{i,j}dpi,j表示当前匹配到i这个字符,然后长度为j的方案数,然后每次O(26)O(26)O(26)刷表法转移,总复杂度O(26n2)O(26n^2)O(26n2)。
这个方法的核心思路就在于利用了自动机优化dp,处理一些难以处理的限制。
注意细节:
- 数组开小了。。。这就是我小数据对拍都过了,但是大数据全WA的原因,我还以为是取模的问题。。。
- 暴力哈希的时候单模数比不过ULL自然溢出,很容易就会发生冲突。
考虑正解,只是在原来的基础上进行优化,发现使用填表法效率更高,每个点对应的转移是一段区间,所以可以前缀和优化。