一道有趣的题目
题意:
现在有一个字符串 $s$($1 \leq |s| \leq 10^6$),现在选择一个区间$[l,r]$,反转一次或者不反转。若某区间的字母各不相同,则该区间为完美区间。你要做的就是执行完操作后使完美区间的长度最大。(整个字符串的字母种类数不超过$20$)
题解:
这个问题可以转换为寻找两个不相交的完美区间使得他们的长度和最大。
首先枚举所有的完美区间,复杂度为$O(n \cdot siz)$,$siz$为字符种类数。
对于每个完美区间,用二进制形式来表示,若第$i$个字母存在,则第$i$位为$1$,如$abcf$即可表示为:
接下来令$dp_{mask}$代表$mask$所有子集的长度的最大值。这个过程可以采用二进制枚举子集的方式进行$dp$。复杂度$O(2^{siz} \cdot {siz})$
接下来其实就是找两个不相交的状态$mask1$和$mask2$使得$dp_{mask1}+dp_{mask2}$最大化,枚举$mask1$,$mask2$其实就是$mask1$按位取反。枚举更新答案即可。
代码:
1 |
|