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

#include <algorithm>
#include <iostream>

using namespace std;

const int MAX = 10001;
typedef pair<int, int> P;

int N, ans;
P num[MAX];
short data[MAX], cop[MAX];

void Copy(int pos, int col) {

  for (int i = 0; i < N; i++)
    cop[i] = data[i];

  cop[pos] = col;
}

void del(int pos, int number, int rev) {

  for (int i = pos + 1; i <= rev; i++)
    cop[i - number] = cop[i];

  fill(&cop[rev - number], &cop[rev], 0);
}

void play() {

  int rev = -1;
  fill(num, num + MAX, P(1, 0));
  int s = 0;
  for (int i = 0; cop[i] != 0; i++, s++) {
    if (i && cop[i] == cop[i - 1])
      num[rev].first++;
    else {
      rev++;
      num[rev].second = cop[i];
    }
  }

  int now = s, r, l;

  for (int i = rev; i >= 0; i--) {

    if (num[i].first >= 4) {
      now -= num[i].first;
      r = i + 1;
      l = i - 1;
      while (r <= rev && l >= 0) {
        if (num[r].second == num[l].second &&
            num[r].first + num[l].first >= 4 && num[r].second) {

          now -= num[r].first + num[l].first;
          r++;
          l--;
        } else
          break;
      }
      break;
    }
  }
  ans = min(ans, now);
  /*
    bool flg = true;

    for(int i = rev-1; i >= 0; i--)
      if(num[i] >= 4){
        del(i,num[i],rev);
        flg = false;
        break;
      }

    if(flg){
      ans = min(ans,rev);
      break;
    }
    */
}

void solve() {

  for (int i = 0; i < N; i++)
    for (int j = 1; j <= 3; j++)
      if (data[i] != j) {
        Copy(i, j);
        play();
      }
}

void init() {

  fill(data, data + MAX, 0);
  fill(cop, cop + MAX, 0);
  ans = MAX;
}

int main() {
  while (cin >> N && N) {
    init();
    for (int i = 0; i < N; i++)
      cin >> data[i];

    solve();
    cout << ans << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <iostream>

using namespace std;

const int MAX = 10001;

int N, ans, num[MAX];
short data[MAX], cop[MAX];

void Copy(int pos, int col) {

  for (int i = 0; i < N; i++)
    cop[i] = data[i];

  cop[pos] = col;
}

void del(int pos, int number, int rev) {

  for (int i = pos + 1; i <= rev; i++)
    cop[i - number] = cop[i];

  fill(&cop[rev - number], &cop[rev], 0);
}

void play() {
  while (1) {
    int rev = 0;
    fill(num, num + MAX, 1);

    int pos, maxnum = 0;

    for (int i = 0; cop[i] != 0; i++, rev++) {
      if (i && cop[i] == cop[i - 1])
        num[i] = num[i - 1] + 1;
      if (maxnum < num[i]) {
        pos = i;
        maxnum = num[i];
      }
    }
    if (maxnum >= 4) {
      del(pos, maxnum, rev);
    } else {
      ans = min(ans, rev);
      break;
    }

    /*   bool flg = true;

    for(int i = rev-1; i >= 0; i--)
      if(num[i] >= 4){
        del(i,num[i],rev);
        flg = false;
        break;
      }

    if(flg){
      ans = min(ans,rev);
      break;
    }
    */
  }
}

void solve() {

  for (int i = 0; i < N; i++)
    for (int j = 1; j <= 3; j++)
      if (data[i] != j) {
        Copy(i, j);
        play();
      }
}

void init() {

  fill(data, data + MAX, 0);
  fill(num, num + MAX, 1);
  fill(cop, cop + MAX, 0);
  ans = MAX;
}

int main() {
  while (cin >> N && N) {
    init();
    for (int i = 0; i < N; i++)
      cin >> data[i];

    solve();
    cout << ans << endl;
  }
  return 0;
}