Source code for submission s797

fm.cpp

  1. #include <algorithm>
  2. #include <cctype>
  3. #include <cmath>
  4. #include <complex>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <iomanip>
  8. #include <iostream>
  9. #include <list>
  10. #include <map>
  11. #include <queue>
  12. #include <set>
  13. #include <sstream>
  14. #include <stack>
  15. #include <string>
  16. #include <utility>
  17.  
  18. using namespace std;
  19.  
  20. #define DEBUG(x) cout << ">>> " << #x << " : " << x << endl;
  21. #define REP(i,a) for (int i = 0; i < (a); ++i)
  22. #define FOR(i,a,b) for (int i = (a); i <= (b); ++i)
  23. #define FORD(i,a,b) for (int i = (a); i >= (b); --i)
  24. inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
  25. const int INF = 1<<29;
  26.  
  27. typedef long long ll;
  28.  
  29. const int MAXN = 1400;
  30. bool input[MAXN][MAXN];
  31. bool rowmax[MAXN][MAXN];
  32. bool cellmax[MAXN][MAXN];
  33.  
  34. int AR, AC, TR, TC;
  35.  
  36. int main() {
  37. while (scanf("%d%d%d%d ", &AR, &AC, &TR, &TC) == 4) {
  38. REP(i,AR) {
  39. char *line = 0;
  40. size_t size;
  41. getline(&line, &size, stdin);
  42. DEBUG(line);
  43. REP(j,AC) input[i][j] = (line[j] == 'X');
  44. free(line);
  45. }
  46. REP(r,AR) {
  47. int sum = 0;
  48. int begin = -TC;
  49. int end = 0;
  50. while (end < AC+TC) {
  51. if (begin >= 0) sum -= input[r][begin];
  52. sum += input[r][end];
  53. rowmax[r][end] = (sum > 0);
  54. ++begin; ++end;
  55. }
  56. }
  57. REP(c,AC+TC) {
  58. int sum = 0;
  59. int begin = -TR;
  60. int end = 0;
  61. while (end < AR+TR) {
  62. if (begin >= 0) sum -= rowmax[begin][c];
  63. sum += rowmax[end][c];
  64. cellmax[end][c] = (sum > 0);
  65. ++begin; ++end;
  66. }
  67. }
  68. int best = INF;
  69. REP(sc,TC) REP(sr,TR) {
  70. int cnt = 0;
  71. int r = sr;
  72. while (r < AR+TR) {
  73. int c = sc;
  74. while (c < AC+TC) {
  75. cnt += (cellmax[r][c] ? 1 : 0);
  76. c += TC;
  77. }
  78. r += TR;
  79. }
  80. DEBUG(sc);
  81. DEBUG(sr);
  82. DEBUG(cnt);
  83. if (cnt < best) best = cnt;
  84. }
  85. printf("%d\n", best);
  86. }
  87. return 0;
  88. }
  89.