bzoj1923 [Sdoi2010]外星千足虫

题目描述

题解:

高消解异或方程组板子题。

如果消元结束后剩余方程(系数一定都为$0$)的结果不为$0$,那么无解;(但是这道题保证有解)

如果存在自由元(即消掉几个元后剩余方程内该项系数都为$0$),那么多解。

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1050;
const int M = 2050;
int n,m,a[M][N];
char mp[N];
bool vis[N];
int gs()
{
    int ret = 0;
    for(int i=1;i<=n;i++)
    {
        int tmp = i;
        while(!a[tmp][i]&&tmp<=n)tmp++;
        if(tmp==n+1)
        {
            ret++;
            continue;
        }
        vis[i]=0;
        if(i!=tmp)
            for(int j=i;j<=n+1;j++)swap(a[i][j],a[tmp][j]);
        for(int j=i+1;j<=n;j++)if(vis[j]&&a[j][i])
            for(int k=i;k<=n+1;k++)
                a[j][k]^=a[i][k];
    }
    return ret;
}
void up()
{
    for(int i=n;i>=1;i--)
        for(int j=i-1;j>=1;j--)if(a[j][i])
            a[j][n+1]^=a[i][n+1];
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%s%d",mp+1,&a[i][n+1]);
        for(int j=1;j<=n;j++)
            a[i][j]=mp[j]-'0';
    }
    for(int i=1;i<=n;i++)vis[i]=1;
    int now = n;
    while(gs())
    {
        for(int i=1;i<=n;i++)
            if(vis[i])
            {
                now++;
                if(now>m)
                {
                    puts("Cannot Determine");
                    return 0;
                }
                swap(a[now],a[i]);
            }
    }
    up();
    printf("%d
",now);
    for(int i=1;i<=n;i++)
        puts(a[i][n+1]?"?y7M#":"Earth");
    return 0;
}
原文地址:https://www.cnblogs.com/LiGuanlin1124/p/10473868.html