Advertisement
Galebickosikasa

Untitled

Dec 12th, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.10 KB | None | 0 0
  1. /*
  2. #pragma GCC optimize("Ofast")
  3. #pragma GCC optimize("O3")
  4. #pragma GCC optimize("unroll-loops")
  5. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx,avx2,tune=native")
  6. */
  7.  
  8. #include <iostream>
  9. #include <cstdio>
  10. #include <vector>
  11. #include <cmath>
  12. #include <map>
  13. #include <algorithm>
  14. #include <string>
  15. #include <utility>
  16. #include <set>
  17. #include <stack>
  18. #include <deque>
  19. #include <ctime>
  20. #include <random>
  21. #include <cassert>
  22. #include <cmath>
  23. #include <climits>
  24. #include <queue>
  25. #include <cstring>
  26. #include <bitset>
  27. #include <iomanip>
  28. #include <chrono>
  29.  
  30. #ifdef LOCAL
  31. #define dbg(x) cerr << #x << " : " << x << endl;
  32. #else
  33. #define dbg(x)
  34. #endif
  35.  
  36.  
  37. // #define int long long
  38. #define pb push_back
  39. #define ppb pop_back()
  40. #define mp make_pair
  41. #define lb lower_bound
  42. #define ub upper_bound
  43. #define all(x) x.begin(), x.end()
  44. #define sz(a) (int)a.size()
  45. #define siz(a) (int)a.size()
  46. #define fr first
  47. #define se second
  48. #define cinv(v) for (auto& x: v) cin >> x
  49. #define fi(a, b) for (int i = a; i < b; ++i)
  50. #define fj(a, b) for (int j = a; j < b; ++j)
  51. #define fk(a, b) for (int k = a; k < b; ++k)
  52. #define fx(x, v) for (auto &x : v)
  53.  
  54. template <typename T1, typename T2> inline bool chkmin(T1 &x, const T2 &y) {if (x > y) {x = y; return 1;} return 0;}
  55. template <typename T1, typename T2> inline bool chkmax(T1 &x, const T2 &y) {if (x < y) {x = y; return 1;} return 0;}
  56.  
  57. #define mine chkmin
  58. #define maxe chkmax
  59.  
  60. using namespace std;
  61.  
  62. typedef long long ll;
  63. typedef unsigned long long ull;
  64. typedef char ch;
  65. typedef string str;
  66. typedef pair<int, int> pii;
  67. typedef vector<int> vi;
  68. typedef vector<vi> vvi;
  69. typedef vector<pii> vpii;
  70. typedef vector<vpii> vvpii;
  71. typedef vector<ch> vch;
  72. typedef vector<str> vs;
  73.  
  74. const int MOD = (int)1e9 + 7;
  75. const int INF = (int)1e9 + 50;
  76. const long long BIG = (long long)2e18 + 50;
  77. const int MX = 200010;
  78. const double EPS = 1e-9;
  79.  
  80. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  81. mt19937 gen(chrono::steady_clock::now().time_since_epoch().count());
  82.  
  83. template<typename T> ostream& operator<< (ostream &out, const vector<T> &b) {
  84. for (auto k : b) out << k << ' ';
  85. return out;
  86. }
  87.  
  88. template<typename T> istream& operator>> (istream &in, vector<T> &b) {
  89. for (auto& k : b) in >> k;
  90. return in;
  91. }
  92.  
  93. istream& operator>> (istream& in, pii& b) {
  94. in >> b.first >> b.second;
  95. return in;
  96. }
  97.  
  98. ostream& operator<< (ostream& out, const pii& b) {
  99. out << "{" << b.first << ", " << b.second << "}";
  100. return out;
  101. }
  102.  
  103. const int MAXN = 1001;
  104. const int MAXM = MAXN * MAXN / 2;
  105.  
  106. int n, m;
  107. char a[MAXN][MAXN];
  108. int ind[MAXN][MAXN];
  109. vector<int> g[MAXM];
  110. vector<int> b[MAXN][MAXN];
  111. int ban[MAXM];
  112. int used[MAXM];
  113. int ansind[MAXN][MAXN];
  114. char ans[MAXN][MAXN];
  115. vector<int> g1[MAXM];
  116.  
  117. bool cycle = 0;
  118. int num = 0;
  119. int take[MAXM];
  120.  
  121. void dfs(int v, int par = -1) {
  122. used[v] = 1;
  123. num ^= 1;
  124. for (auto u : g[v]) {
  125. if (u != par) {
  126. if (used[u]) {
  127. cycle = 1;
  128. if (num == 1) return;
  129. } else {
  130. dfs(u, v);
  131. }
  132. }
  133. }
  134. num ^= 1;
  135. if (num) {
  136. take[v] = 1;
  137. }
  138. }
  139.  
  140. int color[MAXM];
  141. int mex[11];
  142.  
  143. void dfs1(int v) {
  144. used[v] = 2;
  145. for (int i = 0; i < 11; i++) {
  146. mex[i] = 0;
  147. }
  148. for (auto u : g1[v]) {
  149. if (used[u] < 2) {
  150. dfs1(u);
  151. }
  152. mex[color[u]] = 1;
  153. }
  154. for (int i = 0; i < 11; i++) {
  155. if (mex[i] == 0) {
  156. color[v] = i;
  157. break;
  158. }
  159. }
  160. }
  161.  
  162. int32_t main() {
  163. ios_base::sync_with_stdio(0);
  164. cin.tie(0);
  165. cout.tie(0);
  166. cin >> n >> m;
  167. for (int i = 0; i < n; i++) {
  168. for (int j = 0; j < m; j++) {
  169. cin >> a[i][j];
  170. ind[i][j] = -1;
  171. }
  172. }
  173. int lst = 0;
  174. for (int i = 0; i < n; i++) {
  175. for (int j = 1; j < m; j++) {
  176. if (a[i][j] != '.' && a[i][j] == a[i][j - 1]) {
  177. ind[i][j] = ind[i][j - 1] = lst++;
  178. if (a[i][j] >= 'a' && a[i][j] <= 'z') {
  179. if (i > 0) {
  180. b[i - 1][j].pb(lst - 1);
  181. b[i - 1][j - 1].pb(lst - 1);
  182. } else {
  183. ban[lst - 1] = 1;
  184. }
  185. } else {
  186. if (i == n - 1) ban[lst - 1] = 1;
  187. else {
  188. b[i + 1][j].pb(lst - 1);
  189. b[i + 1][j - 1].pb(lst - 1);
  190. }
  191. }
  192. }
  193. }
  194. }
  195. for (int i = 1; i < n; i++) {
  196. for (int j = 0; j < m; j++) {
  197. if (a[i][j] == a[i - 1][j] && a[i][j] != '.') {
  198. ind[i][j] = ind[i - 1][j] = lst++;
  199. if (a[i][j] >= 'a' && a[i][j] <= 'z') {
  200. if (j == 0) ban[lst - 1] = 1;
  201. else {
  202. b[i][j - 1].pb(lst - 1);
  203. b[i - 1][j - 1].pb(lst - 1);
  204. }
  205. } else {
  206. if (j == m - 1) ban[lst - 1] = 1;
  207. else {
  208. b[i][j + 1].pb(lst - 1);
  209. b[i - 1][j + 1].pb(lst - 1);
  210. }
  211. }
  212. }
  213. }
  214. }
  215. for (int i = 0; i < n; i++) {
  216. for (int j = 0; j < m; j++) {
  217. if (a[i][j] != '.') {
  218. for (auto k : b[i][j]) {
  219. ban[k] = 1;
  220. }
  221. }
  222. }
  223. }
  224. for (int i = 0; i < n; i++) {
  225. for (int j = 0; j < m; j++) {
  226. if (a[i][j] == '.') {
  227. int sz = b[i][j].size();
  228. for (int i1 = 0; i1 < sz; i1++) {
  229. for (int j1 = i1 + 1; j1 < sz; j1++) {
  230. g[b[i][j][i1]].pb(b[i][j][j1]);
  231. g[b[i][j][j1]].pb(b[i][j][i1]);
  232. }
  233. }
  234. }
  235. }
  236. }
  237. for (int i = 0; i < lst; i++) {
  238. sort(all(g[i]));
  239. g[i].resize(unique(all(g[i])) - g[i].begin());
  240. vector<int> nw;
  241. for (auto k : g[i]) {
  242. if (ban[i] || ban[k]) {
  243. continue;
  244. }
  245. nw.pb(k);
  246. }
  247. g[i] = nw;
  248. }
  249. for (int i = 0; i < lst; i++) {
  250. if (!used[i] && !ban[i]) {
  251. cycle = 0;
  252. num = 0;
  253. dfs(i);
  254. }
  255. }
  256. for (int i = 0; i < n; i++) {
  257. for (int j = 0; j < m; j++) {
  258. ansind[i][j] = ind[i][j];
  259. }
  260. }
  261. for (int i = 0; i < n; i++) {
  262. for (int j = 1; j < m; j++) {
  263. if (ind[i][j] != -1 && take[ind[i][j]] && ind[i][j - 1] == ind[i][j]) {
  264. if (a[i][j] >= 'a' && a[i][j] <= 'z') {
  265. ansind[i - 1][j] = ind[i][j];
  266. ansind[i - 1][j - 1] = ind[i][j];
  267. } else {
  268. ansind[i + 1][j] = ind[i][j];
  269. ansind[i + 1][j - 1] = ind[i][j];
  270. }
  271. }
  272. }
  273. }
  274. for (int i = 1; i < n; i++) {
  275. for (int j = 0; j < m; j++) {
  276. if (ind[i][j] != -1 && take[ind[i][j]] && ind[i][j] == ind[i - 1][j]) {
  277. if (a[i][j] >= 'a' && a[i][j] <= 'z') {
  278. ansind[i][j - 1] = ansind[i - 1][j - 1] = ind[i][j];
  279. } else {
  280. ansind[i][j + 1] = ansind[i - 1][j + 1] = ind[i][j];
  281. }
  282. }
  283. }
  284. }
  285. for (int i = 0; i < n; i++) {
  286. for (int j = 0; j < m; j++) {
  287. // cout << ansind[i][j] << " ";
  288. }
  289. // cout << "\n";
  290. }
  291. for (int i = 0; i < n; i++) {
  292. for (int j = 1; j < m; j++) {
  293. int ind1 = ansind[i][j], ind2 = ansind[i][j - 1];
  294. if (ind1 != ind2 && ind1 != -1 && ind2 != -1) {
  295. g1[ind1].pb(ind2);
  296. g1[ind2].pb(ind1);
  297. }
  298. }
  299. }
  300. for (int i = 1; i < n; i++) {
  301. for (int j = 0; j < m; j++) {
  302. int ind1 = ansind[i][j], ind2 = ansind[i - 1][j];
  303. if (ind1 != ind2 && ind1 != -1 && ind2 != -1) {
  304. g1[ind1].pb(ind2);
  305. g1[ind2].pb(ind1);
  306. }
  307. }
  308. }
  309. for (int i = 0; i < lst; i++) {
  310. if (used[i] < 2) dfs1(i);
  311. }
  312. int ansval = 0;
  313. for (int i = 0; i < lst; i++) {
  314. ansval += take[i];
  315. }
  316. cout << ansval << "\n";
  317. for (int i = 0; i < n; i++) {
  318. for (int j = 0; j < m; j++) {
  319. if (ansind[i][j] == -1) {
  320. cout << ".";
  321. } else {
  322. cout << color[ansind[i][j]];
  323. }
  324. }
  325. cout << "\n";
  326. }
  327. }
  328.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement