原题链接:https://www.nowcoder.com/acm/contest/55/J
bitset水水过,手写的压位倒是炸了
#include <iostream>
#include <bitset>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN=3e3+1;
typedef struct Node{
int x,y;
}Node;
bitset <MAXN*4> a[MAXN];
int row,col;
char str[MAXN];
int dirx[4]={0,0,-1,1};
int diry[4]={1,-1,0,0};
inline int trans(char x){
if(x<='9'&&x>='0') return x-'0';
return 10+x-'A';
}
queue <Node> que;
int main(){
while(scanf("%d %d",&row,&col)){
getchar();
if(row==0) break;
int tot=0;
for(int i=0;i<row;i++){
scanf("%s",str);
for(int j=0;j<col;j++){int num=trans(str[j]);
for(int k=3;k>=0;k--){
if(num%2) a[i].set(j*4+k),tot++;
else a[i].reset(j*4+k);
num/=2;
}
}
}
col*=4;
int ans=0;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(a[i][j]){
a[i].reset(j);
que.push({i,j});Node temp;int anst=1,nowx,nowy;
while(!que.empty()){
temp=que.front();que.pop();
for(int i=0;i<4;i++){nowx=temp.x+dirx[i],nowy=temp.y+diry[i];
if(nowx>=0&&nowy>=0&&nowx<row&&nowy<col&&a[nowx][nowy]){
que.push({nowx,nowy});a[nowx].reset(nowy);
anst++;
}
}
}
if(anst>ans) ans=anst;
tot-=anst;
if(tot<=ans) break;
}
}
}
printf("%d\n",ans);
}
}