1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include <iostream> #include <vector>
typedef std::vector<std::vector<int64_t> > V; int n, m; char str[int(1e6 + 5)]; V sum, diff, ds;
inline int d(const int &x) { return x << 1; }
inline int64_t GetSum2D(const V &sum, const int &y0, const int &x0, const int &y1, const int &x1) { return sum[y1][x1] - sum[y0 - 1][x1] - sum[y1][x0 - 1] + sum[y0 - 1][x0 - 1]; }
inline void Modify2D(V &diff, const int &y0, const int &x0, const int &y1, const int &x1, const int64_t &val) { diff[y0][x0] += val; diff[y1 + 1][x1 + 1] += val; diff[y1 + 1][x0] -= val; diff[y0][x1 + 1] -= val; }
bool Judge(const int64_t &t) { for (int i = 1; i <= n + 1; ++i) diff[i].assign(m + 2, 0);
for (int i = 1, sz_i = n - d(t); i <= sz_i; ++i) for (int j = 1, sz_j = m - d(t); j <= sz_j; ++j) if (GetSum2D(sum, i, j, i + d(t), j + d(t)) == int64_t(d(t) + 1) * (d(t) + 1)) Modify2D(diff, i, j, i + d(t), j + d(t), 1);
for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) { diff[i][j] += diff[i - 1][j] + diff[i][j - 1] - diff[i - 1][j - 1]; ds[i][j] = ds[i - 1][j] + ds[i][j - 1] - ds[i - 1][j - 1] + (diff[i][j] > 0); }
return GetSum2D(sum, 1, 1, n, m) == GetSum2D(ds, 1, 1, n, m); }
int main() { std::ios::sync_with_stdio(0); std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> m;
sum.resize(n + 1); sum[0].resize(m + 1, 0); for (int i = 1; i <= n; ++i) { std::cin >> str + 1;
sum[i].resize(m + 1); sum[i][0] = 0; for (int j = 1; j <= m; ++j) sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + (str[j] == 'X'); }
diff.resize(n + 2); ds.resize(n + 1); diff[0].resize(m + 2, 0); for (int i = 0; i <= n; ++i) ds[i].resize(m + 1, 0);
int r = (n > m ? n : m); for (int l = 0, mid; l < r;) { mid = (l + r) >> 1; if (Judge(mid)) { l = mid + 1; } else { r = mid; } }
std::cout << --r << "\n"; for (int i = 1; i <= n; ++i) diff[i].assign(m + 1, 0);
for (int i = 1, sz_i = n - d(r); i <= sz_i; ++i) for (int j = 1, sz_j = m - d(r); j <= sz_j; ++j) if (GetSum2D(sum, i, j, i + d(r), j + d(r)) == (d(r) + 1) * (d(r) + 1)) diff[i + r][j + r] = 1;
for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) std::cout << (diff[i][j] ? "X" : "."); std::cout << "\n"; }
return 0; }
|