Problem p03968 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <stack>
#include <vector>

using namespace std;

const int MAXN = 400 + 100;

int n;
long long s[MAXN];
map<long long, int> cnt;

long long get_ind(int x0, int x1, int x2, int x3) {
  return (x0) | (x1 << 10) | (x2 << 20) | ((long long)x3 << 30);
}

int get_dig(long long s, int k) { return (s >> (10 * k)) & 1023; }

void add(long long s, int v) {
  for (int i = 0; i < 4; i++)
    cnt[s] += v, s = (s >> 10) | ((s & 1023) << 30);
}

int main() {
  ios::sync_with_stdio(false);
  // freopen("1.in", "r", stdin);
  // freopen("1.out", "w", stdout);

  cin >> n;
  for (int i = 1; i <= n; i++) {
    int x0, x1, x2, x3;
    cin >> x0 >> x1 >> x2 >> x3;
    s[i] = get_ind(x0, x1, x2, x3);
    add(s[i], 1);
  }

  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    add(s[i], -1);
    for (int j = i + 1; j <= n; j++) {
      add(s[j], -1);
      for (int k = 0; k < 4; k++) {
        long long t[4] = {
            get_ind(get_dig(s[j], k), get_dig(s[j], (k + 3) % 4),
                    get_dig(s[i], 1), get_dig(s[i], 0)),
            get_ind(get_dig(s[j], (k + 3) % 4), get_dig(s[j], (k + 2) % 4),
                    get_dig(s[i], 2), get_dig(s[i], 1)),
            get_ind(get_dig(s[j], (k + 2) % 4), get_dig(s[j], (k + 1) % 4),
                    get_dig(s[i], 3), get_dig(s[i], 2)),
            get_ind(get_dig(s[j], (k + 1) % 4), get_dig(s[j], k),
                    get_dig(s[i], 0), get_dig(s[i], 3))};
        long long tmp = 1;
        for (int l = 0; l < 4; l++)
          tmp *= cnt[t[l]], add(t[l], -1);
        for (int l = 0; l < 4; l++)
          add(t[l], 1);
        ans += tmp;
      }
      add(s[j], 1);
    }
  }
  cout << ans << endl;

  return 0;
}


Fixed submission:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <stack>
#include <vector>

using namespace std;

const int MAXN = 400 + 100;

int n;
long long s[MAXN];
map<long long, int> cnt;

long long get_ind(int x0, int x1, int x2, int x3) {
  return (x0) | (x1 << 10) | (x2 << 20) | ((long long)x3 << 30);
}

int get_dig(long long s, int k) { return (s >> (10 * k)) & 1023; }

void add(long long s, int v) {
  for (int i = 0; i < 4; i++)
    cnt[s] += v, s = (s >> 10) | ((s & 1023) << 30);
}

int main() {
  ios::sync_with_stdio(false);
  // freopen("1.in", "r", stdin);
  // freopen("1.out", "w", stdout);

  cin >> n;
  for (int i = 1; i <= n; i++) {
    int x0, x1, x2, x3;
    cin >> x0 >> x1 >> x2 >> x3;
    s[i] = get_ind(x0, x1, x2, x3);
    add(s[i], 1);
  }

  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    add(s[i], -1);
    for (int j = i + 1; j <= n; j++) {
      add(s[j], -1);
      for (int k = 0; k < 4; k++) {
        long long t[4] = {
            get_ind(get_dig(s[j], k), get_dig(s[j], (k + 3) % 4),
                    get_dig(s[i], 1), get_dig(s[i], 0)),
            get_ind(get_dig(s[j], (k + 3) % 4), get_dig(s[j], (k + 2) % 4),
                    get_dig(s[i], 2), get_dig(s[i], 1)),
            get_ind(get_dig(s[j], (k + 2) % 4), get_dig(s[j], (k + 1) % 4),
                    get_dig(s[i], 3), get_dig(s[i], 2)),
            get_ind(get_dig(s[j], (k + 1) % 4), get_dig(s[j], k),
                    get_dig(s[i], 0), get_dig(s[i], 3))};
        long long tmp = 1;
        for (int l = 0; l < 4; l++)
          if (cnt.find(t[l]) == cnt.end()) {
            tmp = 0;
            break;
          }
        if (!tmp)
          continue;
        for (int l = 0; l < 4; l++)
          tmp *= cnt[t[l]], add(t[l], -1);
        for (int l = 0; l < 4; l++)
          add(t[l], 1);
        ans += tmp;
      }
      add(s[j], 1);
    }
  }
  cout << ans << endl;

  return 0;
}