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

#include <algorithm>
#include <cctype>
#include <iostream>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

#define REP(i, j) for (int(i) = 0; (i) < (j); ++(i))
#define FOR(i, k, j) for (int(i) = (k); (i) < (j); ++(i))

bool check(string str);
string makestr(string str);

int main() {
  string tmpin;
  while (getline(cin, tmpin)) {
    string in = makestr(tmpin);
    set<string> s;
    vector<string> tmpvec;
    int tmpsize = in.size();
    FOR(i, 1, tmpsize - 1) {
      int right1 = i - 1, left1 = i + 1, right2 = i - 1, left2 = i + 2;
      while (right1 >= 0 && left1 < tmpsize) {
        string tmp = in.substr(right1, left1 - right1 + 1);
        if (check(tmp))
          tmpvec.push_back(tmp);
        else
          break;
        right1--;
        left1++;
      }
      if (!tmpvec.empty())
        s.insert(tmpvec[tmpvec.size() - 1]);
      tmpvec.clear();
      while (right2 >= 0 && left2 < tmpsize) {
        string tmp = in.substr(right2, left2 - right2 + 1);
        if (check(tmp))
          tmpvec.push_back(tmp);
        else
          break;
        right2--;
        left2++;
      }
      if (!tmpvec.empty())
        s.insert(tmpvec[tmpvec.size() - 1]);
    }
    vector<string> v;

    for (set<string>::iterator its = s.begin(); its != s.end(); its++)
      v.push_back((*its));

    int vsize = v.size();

    REP(i, vsize - 1) {
      int nowm = i;
      FOR(j, i + 1, vsize) {
        if (v[nowm].size() < v[j].size())
          nowm = j;
      }
      swap(v[i], v[nowm]);
    }

    // REP(i, v.size()) cout <<v[i] <<", ";
    // cout <<endl;
    bool startflg = false;

    while (v.size()) {
      vector<string>::iterator it = v.begin();
      if (startflg)
        cout << " ";
      cout << (*it);
      startflg = true;
      string now = (*it);
      v.erase(it);

      int right, left;
      if (now.size() % 2 == 1) {
        right = now.size() / 2 - 1;
        left = now.size() / 2 + 1;
      } else {
        right = now.size() / 2 - 2;
        left = right + 3;
      }

      while (right >= 0 && left < now.size()) {
        string tmp = now.substr(right, left - right + 1);
        if (check(tmp)) {
          for (vector<string>::iterator itv = v.begin(); itv != v.end();
               itv++) {
            if ((*itv) == tmp) {
              v.erase(itv);
              break;
            }
          }
        } else {
          break;
        }
        right--;
        left++;
      }
    }
    cout << endl;
  }
  return 0;
}

bool check(string str) {
  int right = 0, left = str.size() - 1;
  bool ret = true;
  while (right < left) {
    if (str[right] != str[left]) {
      ret = false;
      break;
    }
    right++;
    left--;
  }
  return ret;
}

string makestr(string str) {
  stringstream ss;
  REP(i, str.size()) {
    if (isalpha(str[i])) {
      if (islower(str[i]))
        ss << (char)(toupper(str[i]));
      else
        ss << str[i];
    }
  }
  return ss.str();
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cctype>
#include <iostream>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

#define REP(i, j) for (int(i) = 0; (i) < (j); ++(i))
#define FOR(i, k, j) for (int(i) = (k); (i) < (j); ++(i))

bool check(string str);
string makestr(string str);

int main() {
  string tmpin;
  while (getline(cin, tmpin)) {
    string in = makestr(tmpin);
    set<string> s;
    vector<string> tmpvec;
    FOR(i, 1, in.size() - 1) {
      int right1 = i - 1, left1 = i + 1, right2 = i - 1, left2 = i;
      while (right1 >= 0 && left1 < in.size()) {
        string tmp = in.substr(right1, left1 - right1 + 1);
        if (check(tmp))
          tmpvec.push_back(tmp);
        else
          break;
        right1--;
        left1++;
      }
      if (!tmpvec.empty())
        s.insert(tmpvec[tmpvec.size() - 1]);
      tmpvec.clear();
      while (right2 >= 0 && left2 < in.size()) {
        string tmp = in.substr(right2, left2 - right2 + 1);
        if (check(tmp) && check(tmp) != 2)
          tmpvec.push_back(tmp);
        else if (check(tmp))
          ;
        else
          break;
        right2--;
        left2++;
      }
      if (!tmpvec.empty())
        s.insert(tmpvec[tmpvec.size() - 1]);
    }
    vector<string> v;

    for (set<string>::iterator its = s.begin(); its != s.end(); its++)
      v.push_back((*its));

    int vsize = v.size();

    REP(i, vsize - 1) {
      int nowm = i;
      FOR(j, i + 1, vsize) {
        if (v[nowm].size() < v[j].size())
          nowm = j;
      }
      swap(v[i], v[nowm]);
    }

    // REP(i, v.size()) cout <<v[i] <<", ";
    // cout <<endl;
    bool startflg = false;

    while (v.size()) {
      vector<string>::iterator it = v.begin();
      if (startflg)
        cout << " ";
      cout << (*it);
      startflg = true;
      string now = (*it);
      v.erase(it);

      int right, left;
      if (now.size() % 2 == 1) {
        right = now.size() / 2 - 1;
        left = now.size() / 2 + 1;
      } else {
        right = now.size() / 2 - 2;
        left = right + 3;
      }

      while (right >= 0 && left < now.size()) {
        string tmp = now.substr(right, left - right + 1);
        if (check(tmp)) {
          for (vector<string>::iterator itv = v.begin(); itv != v.end();
               itv++) {
            if ((*itv) == tmp) {
              v.erase(itv);
              break;
            }
          }
        } else {
          break;
        }
        right--;
        left++;
      }
    }
    cout << endl;
  }
  return 0;
}

bool check(string str) {
  int right = 0, left = str.size() - 1;
  if (str[right] == str[left])
    return true;
  else
    return false;
}

string makestr(string str) {
  stringstream ss;
  REP(i, str.size()) {
    if (isalpha(str[i])) {
      if (islower(str[i]))
        ss << (char)(toupper(str[i]));
      else
        ss << str[i];
    }
  }
  return ss.str();
}