#include<iostream>
#include<fstream>
using namespace std;
int n,m;
int v[2000];
int a[2][2000];
int map[520][520];
int link[520];
int vis[520];
int dfs(int s){
int i;
for(i=1;i<=m;i++)
if(vis[i]==0&&map[s][i])
{
vis[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=s;
return 1;
}
}
return 0;
}
void solve(){
int i,j,k=0;
memset(link,-1,sizeof(link));
for(i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) k++;
}
cout<<n+m-k<<endl;
}
char c[12];
void ok(){
int i,j,k;
int n1=0,n2=0;
int m1=0,m2=0;
for(i=1;i<=n;i++)
{
if(c[i]=='*')
{
n1=n1*2+1;
m1++;
n2=n2*2;
}
else
{
n1=n1*2+c[i]-'0';
n2=n2*2+c[i]-'0';
if(c[i]=='1')
{
m1++;m2++;
}
}
}
if(!v[n1])
{
v[n1]=1;
a[m1%2][++a[m1%2][0]]=n1;
}
if(!v[n2])
{
v[n2]=1;
a[m2%2][++a[m2%2][0]]=n2;
}
}
int ok1(int s,int t){
int i,j,k=0;
j=a[0][s]^a[1][t];
for(i=0;i<n;i++)
if(j==(1<<i)) return 1;
return 0;
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
while(cin>>n>>m)
{
if(n==0&&m==0) return;
a[0][0]=0;a[1][0]=0;
memset(v,0,sizeof(v));
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
cin>>c[j];
ok();
}
memset(map,0,sizeof(map));
for(i=1;i<=a[0][0];i++)
for(j=1;j<=a[1][0];j++)
if(ok1(i,j))
map[i][j]=1;
n=a[0][0];
m=a[1][0];
solve();
}
}
int main(){
read();
return 0;
}
转载于:https://www.cnblogs.com/zhaozhe/archive/2011/05/30/2063119.html