pku2724

1 篇文章 1 订阅

/*pku2724*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
using namespace std;
#define _max 3000
int mapmap[_max][_max], N, M, my[_max];
bool visited[_max], num[_max], used[_max][_max];
int n, hash[_max];

int pow0(int k)
{
    int ans=1,i;
    for(i=1;i<=k;i++)
    {
        ans*=2;
    }
    return ans;
}
int change(char *s)//把ch转化为对应的十进制数
{/*
    int i;
    int num = 0;
    for (i = 0; s[i]; i++) {
        num += (s[i] == '1' ? (1 << (N - i - 1)) : 0);
    }
    return num;
  * */
    int i;
    int sum=0;
    int len=N;
    int k=0;
    for(i=len-1;i>=0;i--)
    {
        if(s[i]=='1')sum+=pow0(k);
        k++;
    }
    return sum;
}

bool find(int x) {
    int i;
    for (i = 1; i <= n; i++) {
        if (!visited[i] && mapmap[x][i]) {
            visited[i] = 1;
            if (my[i] == -1 || find(my[i])) {
                my[i] = x;
                return 1;
            }
        }
    }
    return 0;
}

int MMG() {
    int i, ans = 0;
    memset(my, -1, sizeof (my));
    for (i = 1; i <= n; i++) {
        memset(visited, 0, sizeof (visited));
        if (find(i)) ans++;
    }
    return ans;
}

int main() {

    int i, j, k;
    char ch[15];
    //freopen("a.a", "r", stdin);
    while (scanf("%d%d", &N, &M) != EOF) {
        if (N == 0 && M == 0)break;
        memset(mapmap, 0, sizeof (mapmap));
        memset(num, 0, sizeof (num));
        memset(hash, 0, sizeof (hash));
        for (i = 1; i <= M; i++) {
            //cin >> ch;
            scanf("%s", ch);
            for (j = 0; j < N; j++) {

                if (ch[j] == '*')break;
            }
            if (j < N) {
                ch[j] = '1';
                int temp = change(ch);
                num[temp] = 1;
                ch[j] = '0';
                temp = change(ch);
                num[temp] = 1;
            } else {
                int temp = change(ch);
                num[temp] = 1;
            }
        }
        k = 0;
        for (i = 0; i < 2999; i++) {
            if (num[i]) {
                k++;
                hash[k] = i;
            }
        }
        //memset(mapmap, 0, sizeof (mapmap));
        for (i = 1; i <= k; i++) {
            for (j = 1; j <= k; j++) {
                if (i != j) {
                    int c = hash[i]^hash[j];
                    if (c && ((c & (c - 1)) == 0)) {
                        mapmap[i][j] = mapmap[j][i] = 1;
                        //printf("mapmap[%d][%d]=%d,mapmap[%d][%d]=%d/n", i, j, mapmap[i][j], j, i, mapmap[j][i]);
                    }
                }
            }
        }
        n = k;
        int ans = MMG();
        cout << k - ans / 2 << endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值