标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 4912 | Accepted: 2385 |
Description
Input
Output
Sample Input
2 3 yyy yyy yyy 5 wwwww wwwww wwwww wwwww wwwww
Sample Output
0 15
这道题目也是高斯消元法的经典题目,但是和之前的题目想比有些不同。
之前的开关问题在经过高斯消元后,只需要统计其中自有变量的个数,在进行移位运算即可;
在这道题中,需要解决的是在高斯消元后,若只有唯一解则,统计变化的旗子个数,若有多个解即有自由变量
那么要枚举自由变量的所有可能,取最小值。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=300;
int a[maxn][maxn];
int x[maxn];
int free_x[maxn];
int free_num;
int equ,var;
int gauss()
{
int i,j,k,col,max_r;
free_num=0;
for(k=0,col=0;k<equ&&col<var;k++,col++)
{
max_r=k;
for(int i=k+1;i<equ;i++)
{
if(abs(a[i][col])>abs(a[max_r][col]))
max_r=i;
}
if(a[max_r][col]==0)
{
k--;
free_x[free_num++]=col;
continue;
}
if(max_r!=k)
{
for(int j=col;j<var+1;j++)
swap(a[k][j],a[max_r][j]);
}
for(int i=k+1;i<equ;i++)
{
if(a[i][col]!=0)
{
for(int j=col;j<var+1;j++)
a[i][j]^=a[k][j];
}
}
}
for(int i=k;i<equ;i++)
{
if(a[i][col]!=0)
return -1;
}
if(k<var)
return var-k;
for(int i=var-1;i>=0;i--)
{
x[i]=a[i][var];
for(int j=i+1;j<var;j++)
x[i]^=(a[i][j]&&x[j]);
}
return 0;
}
void init(int r)
{
memset(a,0,sizeof(a));
memset(x,0,sizeof