http://acm.pku.edu.cn/JudgeOnline/problem?id=2724
题意:给一个m个n长的字符串01*,其中有*表示这以为既是0也是1, *01 即为 001 和 101 ;
现在有一个操作,就是用*替代某连个字符串的同一位不同的字符后,改两个字符就可以改变其性质,如:
100
101
通过10* 这一个操作两个不合法的字符串就合法了。。
现在知道这些字符串都是不合法的,要求用最少的步数求出使其全部变成合法的。
比如:
*01
100
011
实际上是 001
101
100
011
那么001 和 011 可以操作 0*1 一次, 101 和 100 操作10*一次。共2次。。。
显然有题意就可以得出不可能超过m次 ,那么很容易就会联想到二分匹配,那么在操作匹配完以后可能还存在一部分多余的,那么他们就只能按照原来方式退回去只要一步。。那么总步数为 总数 - 2*匹配数 + 匹配数。
1 首先要对字符串判重。。
2 建图 : 两个只相差一个字符的串连一条无向边,建图的时候可以将字符串转化成 数,进行^ & 操作。
进行^操作如:
111111
111011
----------
000100
设 c = A^B
那么AB只一位不同必然有 C & (C-1) == 0
10000
01111
--------
00000
或者c == 0 是 0 & -1 == 0
.………………………………………………………………
代码: