# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
22454 | AcornCkiGs14004Team (#40) | Young Zebra (KRIII5_YZ) | C++11 | 179 ms | 13056 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <math.h>
#include <assert.h>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <algorithm>
#include <iostream>
#include <functional>
using namespace std;
typedef long long ll;
typedef pair<int, int> Pi;
#define Fi first
#define Se second
#define pb(x) push_back(x)
#define sz(x) (int)x.size()
#define rep(i, n) for(int i=0;i<n;i++)
#define all(x) x.begin(), x.end()
int N, M;
int A[440][440];
int p[170070], z[170070];
int Find(int x){return p[x] == x ? x : p[x] = Find(p[x]); }
inline int idx(int x, int y){ return x * M + y; }
int ans[440][440];
int chk[170070];
typedef pair<int, int> pii;
set <pii> S;
inline int get_color(int x, int y){
x %= N; if(x < 0) x += N;
y %= M; if(y < 0) y += M;
return A[x][y];
}
int bfs(int x, int mx){
S.clear();
queue <pii> que;
que.push(pii(x/M, x%M));
S.insert(pii(x/M, x%M));
int cnt = 1;
int xx[4] = {1, 0, -1, 0};
int yy[4] = {0, 1, 0, -1};
while(!que.empty()){
pii t = que.front(); que.pop();
int a = get_color(t.Fi, t.Se);
rep(k, 4){
int tx = t.Fi + xx[k];
int ty = t.Se + yy[k];
if(get_color(tx, ty) != a) continue;
if(S.find(pii(tx, ty)) != S.end()) continue;
S.insert(pii(tx, ty));
que.push(pii(tx, ty));
++cnt;
if(cnt > mx) return 0;
}
}
return 1;
}
void solve(int tc){
scanf("%d%d", &N, &M);
rep(i, N){
char ch[440]; scanf("%s", ch);
rep(j, M)A[i][j] = ch[j] == 'B';
}
rep(i, N*M)z[i] = 1, p[i] = i;
rep(i, N)rep(j, M){
int xx[2] = {0, 1};
int yy[2] = {1, 0};
rep(k, 2){
int x = (i + N - xx[k]) % N;
int y = (j + M - yy[k]) % M;
if(A[i][j] != A[x][y]) continue;
int a = idx(i, j);
int b = idx(x, y);
a = Find(a), b = Find(b);
if(a != b)p[a] = b, z[b] += z[a];
}
}
for(int i=0;i<N*M;i++)if(Find(i) == i){
int t = bfs(i, z[i]);
chk[i] = t;
}
for(int i=0;i<N*M;i++){
ans[i/M][i%M] = (chk[Find(i)] == 0 ? -1 : z[Find(i)]);
}
for(int i=0;i<N;i++){
for(int j=0;j<M;j++)printf("%d ", ans[i][j]); puts("");
}
}
int main(){
int Tc = 1; //scanf("%d", &Tc);
for(int tc=1; tc<=Tc; tc++){
solve(tc);
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |