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

#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
  int C, N, D, r, c, count, a, b, ans = 0;
  static char cost[1000][1000];
  int i, j, k;
  bool mae;
  cin >> C >> N;
  for (i = 0; i < N; i++) {
    cin >> cost[i];
  }
  count = 0;
  for (i = 0; i < N / 2; i++) {
    for (j = 0; j < N / 2; j++) {
      // 左上のマスを対称かどうか調べる
      if (cost[i][j] == cost[N - i - 1][j] &&
          cost[N - i - 1][j] == cost[N - i - 1][N - j - 1] &&
          cost[N - i - 1][N - j - 1] == cost[i][N - j - 1] &&
          cost[i][N - j - 1] == cost[i][j]) {
        // 対称である
      } else {
        count++;
        // printf("最初%d\\n",count);
      }
    }
  }
  if (!count)
    ans++;
  if (C == 1) {
    if (count)
      puts("0");
    else
      puts("1");
    return 0;
  }
  for (k = 1; k < C; k++) {
    cin >> D;
    for (i = 0; i < D; i++) {
      cin >> r >> c;
      r--;
      c--;
      // もともと対称か調べる
      a = N - r - 1;
      b = N - c - 1;
      if (cost[a][b] == cost[N - a - 1][b] &&
          cost[N - a - 1][b] == cost[N - a - 1][N - b - 1] &&
          cost[N - a - 1][N - b - 1] == cost[a][N - b - 1] &&
          cost[a][N - b - 1] == cost[a][b]) {
        mae = true;
      } else {
        mae = false;
      }
      // 変わったマス
      if (cost[r][c] == '0') {
        cost[r][c] = '1';
      } else {
        cost[r][c] = '0';
      }
      if (r >= N / 2)
        r = N - r - 1;
      if (c >= N / 2)
        c = N - c - 1;
      if (cost[r][c] == cost[N - r - 1][c] &&
          cost[N - r - 1][c] == cost[N - r - 1][N - c - 1] &&
          cost[N - r - 1][N - c - 1] == cost[r][N - c - 1] &&
          cost[r][N - c - 1] == cost[r][c]) {
        count--;
        // printf("座標は対称%dk=%d\\n",count,k+1);
      } else {
        if (mae) {
          count++;
          // printf("座標は対称でない%dk=%d\\n",count,k+1);
        }
      }
    }
    if (!count)
      ans++;
  }
  printf("%d\\n", ans);
  return 0;
}


Error: TLE

Fixed submission:

#include <iostream>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
using namespace std;
int main() {
  int C, N, i, j, k, a, b, ans = 0;
  static int tate[500][1000], yoko[1000][500];
  static char cost[1000][1000];
  static int r[10000][100], c[10000][100];
  int D[10000];
  bool taisho1, taisho2;
  cin >> C >> N;
  for (i = 0; i < N; i++) {
    cin >> cost[i];
  }
  for (i = 0; i < N / 2; i++) {
    for (j = 0; j < N; j++) {
      if (cost[i][j] == cost[N - i - 1][j]) {
        tate[i][j] = TRUE;
        // cout<<'T';
      } else {
        // cout<<'F';
      }
    }
    // putchar('\\n');
  }
  for (i = 0; i < N; i++) {
    for (j = 0; j < N / 2; j++) {
      if (cost[i][j] == cost[i][N - j - 1]) {
        yoko[i][j] = TRUE;
        // cout<<'T';
      } else {
        // cout<<'F';
      }
    }
    // putchar('\\n');
  }
  // 一枚目が対象かどうか
  taisho1 = taisho2 = true;
  for (i = 0; i < N / 2; i++) {
    for (j = 0; j < N; j++) {
      if (!tate[i][j]) {
        taisho1 = false;
      }
    }
  }
  for (i = 0; i < N; i++) {
    for (j = 0; j < N / 2; j++) {
      if (!yoko[i][j]) {
        taisho2 = false;
      }
    }
  }
  if (taisho1 && taisho2) {
    // printf("1枚目対称\\n");
    ans++;
  } else {
    // printf("1枚目対称でない\\n");
  }
  // 1
  if (C == 1) {
    // 1枚だけ
    if (taisho1 && taisho2) {
      cout << '1' << endl;
    } else {
      cout << '0' << endl;
    }
    return 0;
  }
  // Cは1でない
  for (k = 0; k < C - 1; k++) {
    cin >> D[k];
    for (i = 0; i < D[k]; i++) {
      cin >> a >> b;
      a--;
      b--;
      /*
      r[0][i]=a;
      c[0][i]=b;
      */
      if (a >= N / 2) // 入力されたx座標が半分超える
      {
        tate[N - 1 - a][b] = !tate[N - 1 - a][b];
      } else {
        tate[a][b] = !tate[a][b];
      }
      if (b >= N / 2) // 入力されたy座標が半分超える
      {
        yoko[a][N - 1 - b] = !yoko[a][N - 1 - b];
      } else {
        yoko[a][b] = !yoko[a][b];
      }
    }
    // print
    taisho1 = taisho2 = true;
    for (i = 0; i < N / 2; i++) {
      for (j = 0; j < N; j++) {
        if (tate[i][j]) {
          // cout<<'T';
        } else {
          taisho1 = false;
          // cout<<'F';
        }
      }
      // putchar('\\n');
    }
    for (i = 0; i < N; i++) {
      for (j = 0; j < N / 2; j++) {
        if (yoko[i][j]) {
          // cout<<'T';
        } else {
          taisho2 = false;
          // cout<<'F';
        }
      }
      // putchar('\\n');
    }
    if (taisho1 && taisho2) {
      // printf("%d:対称\\n",k+2);
      ans++;
    } else {
      // printf("%d:対称でない\\n",k+2);
    }
  }
  cout << ans << endl;
  return 0;
}