Problem p00783 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>

#define ALL(a) (a).begin(), (a).end()
#define ll long long

using namespace std;

signed main() {
  string raw;
  while (getline(cin, raw)) {
    string str;
    for (auto e : raw) {
      if (isalpha(e))
        str.push_back((char)toupper(e));
    }
    string rev;
    for (auto i = str.rbegin(); i != str.rend(); ++i) {
      rev.push_back(*i);
    }
    int n = str.size();
    set<string> anss;
    for (int i = 0; i < n; i++) {
      string temp;
      for (int j = 1; 1 + 2 * j <= n; j++) {
        if (i - j < 0 || i + j >= n)
          break;
        if (str.substr(i - j, j) == rev.substr(n - i - 1 - j, j)) {
          temp = str.substr(i - j, 2 * j + 1);
        }
      }
      if (temp.size() != 0 && anss.find(temp) == anss.end()) {
        anss.insert(temp);
      }
    }
    for (int i = 0; i < n; i++) {
      string temp;
      for (int j = 2; 2 * j <= n; j++) {
        if (i - j + 1 < 0 || i + j >= n)
          break;
        if (str.substr(i - j + 1, j) == rev.substr(n - i - j - 1, j)) {
          temp = str.substr(i - j + 1, 2 * j);
        }
      }
      if (temp.size() != 0 && anss.find(temp) == anss.end()) {
        anss.insert(temp);
      }
    }
    //		cerr << "aa" << endl;
    for (auto itr = anss.begin(); itr != anss.end(); ++itr) {
      bool flag = false;
      for (auto ritr = anss.rbegin(); ritr != anss.rend(); ++ritr) {
        auto s = (*ritr).size();
        auto is = (*itr).size();
        if (s < is || s % 2 != is % 2 || *itr == *ritr)
          continue;
        if (*itr == (*ritr).substr((s - is) / 2, is)) {
          flag = true;
        }
      }
      if (flag)
        itr = anss.erase(itr);
    }
    for (auto itr = anss.begin(); itr != anss.end(); ++itr) {
      if (itr != anss.begin())
        cout << " ";
      cout << *itr;
    }
    cout << endl;
  }
  return 0;
}


Error: WA

Fixed submission:

#include <bits/stdc++.h>

#define ALL(a) (a).begin(), (a).end()
#define ll long long

using namespace std;

signed main() {
  string raw;
  while (getline(cin, raw)) {
    string str;
    for (auto e : raw) {
      if (isalpha(e))
        str.push_back((char)toupper(e));
    }
    string rev;
    for (auto i = str.rbegin(); i != str.rend(); ++i) {
      rev.push_back(*i);
    }
    int n = str.size();
    set<string> anss;
    for (int i = 0; i < n; i++) {
      string temp;
      for (int j = 1; 1 + 2 * j <= n; j++) {
        if (i - j < 0 || i + j >= n)
          break;
        if (str.substr(i - j, j) == rev.substr(n - i - 1 - j, j)) {
          temp = str.substr(i - j, j) + str[i] + rev.substr(n - i - 1 - j, j);
        }
      }
      if (temp.size() != 0 && anss.find(temp) == anss.end()) {
        anss.insert(temp);
      }
    }
    for (int i = 0; i < n; i++) {
      string temp;
      for (int j = 2; 2 * j <= n; j++) {
        if (i - j + 1 < 0 || i + j >= n)
          break;
        if (str.substr(i - j + 1, j) == rev.substr(n - i - 1 - j, j)) {
          temp = str.substr(i - j + 1, j) + rev.substr(n - i - 1 - j, j);
        }
      }
      if (temp.size() != 0 && anss.find(temp) == anss.end()) {
        anss.insert(temp);
      }
    }
    for (auto itr = anss.begin(); itr != anss.end(); ++itr) {
      bool flag = false;
      for (auto ritr = anss.rbegin(); ritr != anss.rend(); ++ritr) {
        auto s = (*ritr).size();
        auto is = (*itr).size();
        if (is < s || s % 2 == is % 2)
          continue;
        if (*itr == (*ritr).substr((s - is) / 2, is)) {
          flag = true;
          break;
        }
      }
      if (flag)
        anss.erase(itr);
    }
    for (auto itr = anss.begin(); itr != anss.end(); ++itr) {
      if (itr != anss.begin())
        cout << " ";
      cout << *itr;
    }
    cout << endl;
  }
  return 0;
}