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

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 1LL << 55;
int Max(int &a, int b) { return a = max(a, b); }
int Min(int &a, int b) { return a = min(a, b); }
int M[5][5];
int X[20], Y[20];
int cnt;
void ume(int y, int x) {
  X[cnt] = x + 2;
  Y[cnt++] = y + 2;
}

int fil[128];
int dy[7] = {-1, -1, 0, 0, 0, 1, 1};
int dx[7] = {0, 1, -1, 0, 1, -1, 0};

int filter(int y, int x, int M[5][5]) {

  int bit = 0;
  for (int i = 0; i < 7; i++) {
    int ny = y + dy[i];
    int nx = x + dx[i];
    if (ny < 0 || nx < 0 || ny >= 5 || nx >= 5)
      return 0;
    if (M[ny][nx] == -1)
      return 0;
    bit += (M[ny][nx] << i);
  }
  return fil[bit];
}

void sim() {
  int tmp[5][5];
  for (int i = 0; i < 5; i++)
    for (int j = 0; j < 5; j++)
      tmp[i][j] = M[i][j];
  for (int i = 0; i < 19; i++)
    M[Y[i]][X[i]] = filter(Y[i], X[i], tmp);
}

signed main() {
  memset(M, -1, sizeof(M));
  ume(-1, 0);
  ume(-1, 1);
  ume(0, -1);
  ume(0, 0);
  ume(0, 1);
  ume(1, 0);
  ume(1, -1);

  ume(2, 0);
  ume(1, 1);
  ume(0, 2);
  ume(-1, 2);
  ume(-2, 2);
  ume(-2, 1);
  ume(-2, 0);
  ume(-1, -1);
  ume(0, -2);
  ume(1, -2);
  ume(2, -2);
  ume(2, -1);

  while (1) {
    int ans = true;
    for (int i = 0; i < 128; i++) {
      char ch;
      cin >> ch;
      if (ch == '#')
        return 0;
      fil[i] = ch == '1';
    }
    for (int i = 0; i < (1LL << 19) && ans; i++) {
      for (int j = 0, t = i; j < 19; j++, t /= 2)
        M[Y[j]][X[j]] = t % 2;
      int a, b;
      sim();
      a = M[2][2];
      sim();
      b = M[2][2];
      ans &= (a == b);
    }
    cout << (ans ? "yes" : "no") << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 1LL << 55;
int Max(int &a, int b) { return a = max(a, b); }
int Min(int &a, int b) { return a = min(a, b); }
typedef pair<int, int> P;
typedef pair<P, int> PP;
int M[5][5];
int X[20], Y[20];
void ume(int y, int x) {
  static int cnt = 0;
  X[cnt] = x + 2;
  Y[cnt++] = y + 2;
}

int fil[128];
int dx[7] = {0, 1, -1, 0, 1, -1, 0};
int dy[7] = {-1, -1, 0, 0, 0, 1, 1};

int filter(int y, int x, int M[5][5]) {

  int bit = 0;
  for (int i = 0; i < 7; i++) {
    int nx = x + dx[i];
    int ny = y + dy[i];
    if (ny < 0 || nx < 0 || ny >= 5 || nx >= 5)
      return 0;
    if (M[ny][nx] == -1)
      return 0;
    bit += (M[ny][nx] << i);
  }
  return fil[bit];
}

void sim() {
  int tmp[5][5];
  for (int i = 0; i < 5; i++)
    for (int j = 0; j < 5; j++)
      tmp[i][j] = M[i][j];
  for (int i = 0; i < 19; i++)
    M[Y[i]][X[i]] = filter(Y[i], X[i], tmp);
}

signed main() {
  memset(M, -1, sizeof(M));
  ume(-1, 0);
  ume(-1, 1);
  ume(0, -1);
  ume(0, 0);
  ume(0, 1);
  ume(1, 0);
  ume(1, -1);

  ume(2, 0);
  ume(1, 1);
  ume(0, 2);
  ume(-1, 2);
  ume(-2, 2);
  ume(-2, 1);
  ume(-2, 0);
  ume(-1, -1);
  ume(0, -2);
  ume(1, -2);
  ume(2, -2);
  ume(2, -1);

  while (1) {
    int ans = true;
    while (1) {
      for (int i = 0; i < 128; i++) {
        char ch;
        cin >> ch;
        if (ch == '#')
          return 0;
        fil[i] = ch == '1';
      }
      for (int i = 0; i < (1LL << 19); i++) {
        for (int j = 0, t = i; j < 19; j++, t /= 2)
          M[Y[j]][X[j]] = t % 2;
        int a, b;
        sim();
        a = M[2][2];
        sim();
        b = M[2][2];
        ans &= a == b;
      }

      cout << (ans ? "yes" : "no") << endl;
    }
  }
  return 0;
}