Problem p00521 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

int main() {
  int h, w;
  char maps[1010][1010];
  char kun[10];
  int cnt;
  int ans = 0;
  string str;
  int best;
  char joi[3];
  // 旗の入力
  cin >> h >> w;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> maps[i][j];
    }
  }
  // 勲章入力
  cin >> str;
  kun[0] = str[0];
  kun[1] = str[1];
  cin >> str;
  kun[2] = str[0];
  kun[3] = str[1];
  cnt = 0;
  // 昔の旗の勲章の数
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (kun[0] == maps[i][j] && kun[1] == maps[i][j + 1] &&
          kun[2] == maps[i + 1][j] && kun[3] == maps[i + 1][j + 1])
        cnt++;
    }
  }
  if (ans < cnt)
    ans = cnt;
  best = cnt;
  // 白紙のパターン
  joi[0] = 'J';
  joi[1] = 'O';
  joi[2] = 'I';
  int miruy[] = {-1, -1, 0, 0, -1, -1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1};
  int mirux[] = {-1, 0, -1, 0, 0, 1, 0, 1, -1, 0, -1, 0, 0, 1, 0, 1};
  int ima;
  char kari;
  for (int s = 0; s < h; s++) {
    for (int r = 0; r < w; r++) {
      cnt = 0;
      kari = maps[s][r];
      for (int i = 0; i < 13; i += 4) {
        if (kun[0] == maps[s + miruy[i]][r + mirux[i]]) {
          if (kun[1] == maps[s + miruy[i + 1]][r + mirux[i + 1]]) {
            if (kun[2] == maps[s + miruy[i + 2]][r + mirux[i + 2]]) {
              if (kun[3] == maps[s + miruy[i + 3]][r + mirux[i + 3]])
                cnt++;
            }
          }
        }
      }
      ima = cnt;
      best -= ima;
      for (int m = 0; m < 3; m++) {
        maps[s][r] = joi[m];
        cnt = 0;
        for (int i = 0; i < 13; i += 4) {
          if (kun[0] == maps[s + miruy[i]][r + mirux[i]]) {
            if (kun[1] == maps[s + miruy[i + 1]][r + mirux[i + 1]]) {
              if (kun[2] == maps[s + miruy[i + 2]][r + mirux[i + 2]]) {
                if (kun[3] == maps[s + miruy[i + 3]][r + mirux[i + 3]])
                  cnt++;
              }
            }
          }
        }
        if (ans < best + cnt)
          ans = best + cnt;
        //	cout<<best<<" "<<cnt<<" "<<s<<","<<r<<" "<<joi[m]<<endl;
      }
      maps[s][r] = kari;
      best += ima;
    }
  }
  cout << ans << endl;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

int main() {
  int h, w;
  char maps[1010][1010];
  char kun[10];
  int cnt;
  int ans = 0;
  string str;
  int best;
  char joi[3];
  // 旗の入力
  cin >> h >> w;
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> maps[i][j];
    }
  }
  // 勲章入力
  cin >> str;
  kun[0] = str[0];
  kun[1] = str[1];
  cin >> str;
  kun[2] = str[0];
  kun[3] = str[1];
  cnt = 0;
  // 昔の旗の勲章の数
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      if (kun[0] == maps[i][j] && kun[1] == maps[i][j + 1] &&
          kun[2] == maps[i + 1][j] && kun[3] == maps[i + 1][j + 1])
        cnt++;
    }
  }
  if (ans < cnt)
    ans = cnt;
  best = cnt;
  // 白紙のパターン
  joi[0] = 'J';
  joi[1] = 'O';
  joi[2] = 'I';
  for (int s = 0; s < h; s++) {
    for (int r = 0; r < w; r++) {
      for (int m = 0; m < 3; m++) {
        char kari = maps[s][r];
        maps[s][r] = joi[m];
        cnt = 0;
        for (int i = 0; i < h; i++) {
          for (int j = 0; j < w; j++) {
            if (kun[0] == maps[i][j]) {
              if (kun[1] == maps[i][j + 1]) {
                if (kun[2] == maps[i + 1][j]) {
                  if (kun[3] == maps[i + 1][j + 1])
                    cnt++;
                }
              }
            }
          }
        }
        //	cout<<cnt<<" "<<s<<","<<r<<" "<<joi[m]<<endl;
        if (ans < cnt)
          ans = cnt;
        maps[s][r] = kari;
      }
    }
  }
  cout << ans << endl;
}