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

//
//  main.cpp

#include <iostream>
#include <vector>
using namespace std;

int main() {
  while (1) {
    int n;
    cin >> n;
    if (n == 0)
      break;
    string array;
    for (int i = 0; i < n; i++) {
      char input;
      //			scanf("%c\\n",&input);
      cin >> input;
      array += input;
    }

    int answer = 10000000;
    vector<int> points;
    for (int i = 1; i < array.size() - 1; i++) {
      if (array[i - 1] != array[i] || array[i + 1] != array[i]) {
        points.push_back(i);
      }
    }
    for (int i = 0; i < points.size(); i++) {
      string memo = array;
      vector<char> list;
      if (memo[points[i]] == '1') {
        list.push_back('2');
        list.push_back('3');
      } else if (memo[points[i]] == '2') {
        list.push_back('1');
        list.push_back('3');
      } else {
        list.push_back('1');
        list.push_back('2');
      }

      for (int k = 0; k < 2; k++) {
        memo[points[i]] = list[k];
        bool isChanged = true;
        int continuity[10001];
        continuity[0] = 1;
        while (isChanged) {
          int Max = 1;
          int where = 0;
          for (int j = 1; j < memo.size(); j++) {
            if (memo[j - 1] == memo[j]) {
              continuity[j] = continuity[j - 1] + 1;
            } else {
              continuity[j] = 1;
            }
            if (Max != max(Max, continuity[j])) {
              where = j;
              Max = max(Max, continuity[j]);
            }
          }
          if (Max >= 4) {
            memo.erase(memo.begin() + where - Max + 1,
                       memo.begin() + where + 1);
          } else {
            isChanged = false;
          }
          if (memo.size() == 0) {
            isChanged = false;
          }
        }
        answer = min(answer, int(memo.size()));
      }
    }
    cout << answer << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

//
//  main.cpp

#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;

int main() {
  while (1) {
    int n;
    cin >> n;
    if (n == 0)
      break;
    string array;
    for (int i = 0; i < n; i++) {
      char input[10];
      scanf("%s", input);
      array += input[0];
    }

    int answer = 10000000;
    vector<int> points;
    for (int i = 1; i < array.size() - 1; i++) {
      if (array[i - 1] != array[i] || array[i + 1] != array[i]) {
        points.push_back(i);
      }
    }
    for (int i = 0; i < points.size(); i++) {
      string memo = array;
      vector<char> list;
      if (memo[points[i]] == '1') {
        list.push_back('2');
        list.push_back('3');
      } else if (memo[points[i]] == '2') {
        list.push_back('1');
        list.push_back('3');
      } else {
        list.push_back('1');
        list.push_back('2');
      }

      for (int k = 0; k < 2; k++) {
        memo[points[i]] = list[k];
        bool isChanged = true;
        int continuity[10001] = {};
        continuity[0] = 1;
        while (isChanged) {
          int Max = 1;
          int where = 0;
          for (int j = 1; j < memo.size(); j++) {
            if (memo[j - 1] == memo[j]) {
              continuity[j] = continuity[j - 1] + 1;
            } else {
              continuity[j] = 1;
            }
            if (Max != max(Max, continuity[j])) {
              where = j;
              Max = max(Max, continuity[j]);
            }
          }
          if (Max >= 4) {
            memo.erase(memo.begin() + where - Max + 1,
                       memo.begin() + where + 1);
          } else {
            isChanged = false;
          }
          if (memo.size() == 0) {
            isChanged = false;
          }
        }
        int size = memo.size();
        answer = min(answer, size);
      }
    }
    cout << answer << endl;
  }

  return 0;
}