「CodeForces-1250E」The Coronation
给定一系列01串,求翻转次数最小的情况下,令任意两个串有至少k位相同的合法方案
题意
给定$n$个长度为$m$的01串,可以对任意串进行翻转,求满足任意两个串至少有k位相同的翻转方案,并使翻转次数最小。
题解
2-SAT问题。
设串不翻转为0,翻转为1,则对于任意两个串都有如下四种情况:
- a,b和a,rev(b)相同位数均大于等于k,此时a,b相互之间没有限制;
- a,b相同之间位数大于等于k,a,rev(b)之间相同位数小于k,此时a,b必须相同,即XOR(a,b)=0;
- a,b相同之间位数小于等于k,a,rev(b)之间相同位数大于k,此时a,b必须相反,即XOR(a,b)=1;
- a,b和a,rev(b)相同位数均小于k,即无论怎么翻转都不能使a,b两者匹配;
一旦出现4,整组情况一定是无解的。
相当于原串所代表的点形成若干个联通块,每一个联通块中的元素颜色是相互联系的(即如果翻转一个,必须翻转该块中的所有元素)。
建完图后对点$i$和点$i+n$进行dfs,因为图的两侧完全对称,一定会搜出一组点完全相反的两种染色方案,只要选择翻转次数较小的那一组即可。注意在dfs时需要判奇环,如果出现奇环则无解。
代码
1 |
|