Result: Accepted
Time: 483ms
Memory: 1896kB
#include<iostream>
#include<cstring>
#include<vector>
#include<deque>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
int T,n;
char mmp[105][105];
int a[105][105],rea[105][105];
int can[105],recan[105][105];
int ans;
void DFS(int nl,int ty)
{
// printf("Lie:%d\n",nl);
// for(int i=1;i<=n;i++)
// {
// if(can[i])printf("1\n");
// else printf("0\n");
// }
if(nl>=n+1)
{
int ret=0;
for(int i=1;i<=n;i++)if(can[i])ret++;
ans=max(ret,ans);
return ;
}
bool tag=false;
int cnt=0;
for(int i=1;i<=n;i++)
{
if( (a[i][nl]^ty)==1&&can[i] )cnt++;
}
// printf("cnt:%d\n",cnt);
// printf("--------\n");
if(cnt>ans)
{
for(int i=0;i<=1;i++)
{
for(int j=1;j<=n;j++)recan[nl][j]=can[j];
for(int j=1;j<=n;j++)
{
if( (a[j][nl]^ty)==1&&can[j] )can[j]=1;
else can[j]=0;
}
DFS(nl+1,i);
for(int j=1;j<=n;j++)can[j]=recan[nl][j];
}
}
return ;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=0;
for(int i=1;i<=n;i++)
{
can[i]=0;
scanf("%s",mmp[i]+1);
bool tag=true;
for(int j=1;j<=n;j++)
{
a[i][j]=mmp[i][j]-'0';
if(!a[i][j])
{
tag=false;
}
}
if(tag)
{
ans++;
}
}
//printf("**%d\n",ans);
for(int i=0;i<=1;i++)
{
for(int j=1;j<=n;j++)can[j]=1;
DFS(1,i);
}
printf("%d\n",ans);
}
}