Codeforces314E题解
题意:
- 给你一个仅含小写字母和‘?’的字符串,你需要将问号处填上小写或者大写字母,统计满足下列要求的方案数:(对$10^9+7$取模)
- 每个小写字母都有向后匹配的对应大写字母,并且没有剩余的大写字母。
- 每两对对应的小大写字母构成的区间$[l_1,r_1],[l_2,r_2]$满足$l_1<r_1<l_2<r_2$或者$l_1<l_2<r_2<r_1$。
- $n \leq 10^5$
题解:
- 首先考虑一个非常暴力的转移方法。
- $dp[i][j]$表示当前到第$i$位还剩下$j$个未匹配的方案数。
- 转移方程:
- 如果位置$i$是个小写字母:
- 否则:
- (注意$j=0$的情况)
- 这样显然过不了,然而让我难以理解的是std其实就是对这个$O(n^2)$算法的优化。
- 比如数组开滚动,只维护一段区间,乘25放到最后等等。然后我还是TLE,于是我就愉快的打表啦!(wtf?)
- (听说WC2017的挑战的其中一部分差不多就是这样的,原来循环展开什么的就是用来干这个的?)
代码:
1 |
|