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

#include <iostream>
#include <map>
#include <queue>
#include <string>
using namespace std;

struct bug {
  string name;
  int tim;
};

int main() {
  string worm;
  while (cin >> worm) {
    if (worm == "0") {
      break;
    }
    map<string, int> memo;
    bug w;
    w.name = worm;
    w.tim = 0;
    queue<bug> que;
    que.push(w);
    bool fl = false;
    while (que.size()) {
      bug tmp = que.front();
      que.pop();
      // êF»è
      bool flag = true;
      for (int i = 0; i < tmp.name.size(); i++) {
        if (tmp.name[0] != tmp.name[i]) {
          flag = false;
          break;
        }
      }
      if (flag) {
        fl = true;
        cout << tmp.tim << endl;
        break;
      }
      // êxo½©»è
      if (memo.find(tmp.name) != memo.end())
        continue;
      else
        memo[tmp.name] = tmp.tim;

      // ÇÁ
      for (int i = 0; i < tmp.name.size(); i++) {
        if (tmp.name[i] != tmp.name[i + 1]) {
          bug t = tmp;
          if ((tmp.name[i] == 'r' && tmp.name[i + 1] == 'g') ||
              (tmp.name[i] == 'g' && tmp.name[i + 1] == 'r')) {
            t.name[i] = 'b';
            t.name[i + 1] = 'b';
          } else if ((tmp.name[i] == 'g' && tmp.name[i + 1] == 'b') ||
                     (tmp.name[i] == 'b' && tmp.name[i + 1] == 'g')) {
            t.name[i] = 'r';
            t.name[i + 1] = 'r';
          } else if ((tmp.name[i] == 'b' && tmp.name[i + 1] == 'r') ||
                     (tmp.name[i] == 'r' && tmp.name[i + 1] == 'b')) {
            t.name[i] = 'g';
            t.name[i + 1] = 'g';
          }
          t.tim++;
          que.push(t);
        }
      }
    }
    if (!fl)
      cout << "NA" << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <iostream>
#include <queue>
#include <string>
#include <vector>
using namespace std;
typedef pair<string, int> P;
vector<string> vs;

bool is_memo(string str) {
  for (unsigned i = 0; i < vs.size(); i++) {
    if (vs[i] == str)
      return false;
  }
  return true;
}
int search(string str) {
  queue<P> que;
  P p;
  p.first = str;
  p.second = 0;
  que.push(p);
  vs.push_back(p.first);
  while (que.size()) {
    P s = que.front();
    que.pop();
    if (s.second > 10)
      break;
    bool is_all = true;
    for (unsigned i = 0; i < s.first.size(); i++) {
      if (s.first[0] != s.first[i]) {
        is_all = false;
        break;
      }
    }
    if (is_all) {
      return s.second;
    }
    int a = 0;
    for (unsigned i = 0; i < s.first.size() - 1; i++) {
      P ss = s;
      if ((ss.first[i] != ss.first[i + 1])) {
        if ((ss.first[i] == 'r' && ss.first[i + 1] == 'g') ||
            (ss.first[i] == 'g' && ss.first[i + 1] == 'r')) {
          ss.first[i] = 'b';
          ss.first[i + 1] = 'b';
          if (is_memo(ss.first)) {
            ss.second++;
            que.push(ss);
            vs.push_back(ss.first);
          }
        }
        if ((ss.first[i] == 'r' && ss.first[i + 1] == 'b') ||
            (ss.first[i] == 'b' && ss.first[i + 1] == 'r')) {
          ss.first[i] = 'g';
          ss.first[i + 1] = 'g';
          if (is_memo(ss.first)) {
            ss.second++;
            que.push(ss);
            vs.push_back(ss.first);
          }
        }
        if ((ss.first[i] == 'b' && ss.first[i + 1] == 'g') ||
            (ss.first[i] == 'g' && ss.first[i + 1] == 'b')) {
          ss.first[i] = 'r';
          ss.first[i + 1] = 'r';
          if (is_memo(ss.first)) {
            ss.second++;
            que.push(ss);
            vs.push_back(ss.first);
          }
        }
      }
    }
  }
  return -1;
}

int main() {
  string str;
  while (cin >> str) {
    if (str[0] == '0')
      break;
    int p = search(str);
    if (p == -1)
      cout << "NA" << endl;
    else
      cout << p << endl;
  }
  return 0;
}