Problem p03383 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
using namespace std;

int main() {
  int H, W;
  cin >> H >> W;
  vector<string> S(H);
  for (int i = 0; i < H; i++) {
    cin >> S[i];
  }

  map<map<char, int>, int> row_mp;
  for (int i = 0; i < H; i++) {
    map<char, int> mp;
    for (char c : S[i]) {
      mp[c]++;
    }
    row_mp[mp]++;
  }

  map<map<char, int>, int> col_mp;
  for (int i = 0; i < W; i++) {
    map<char, int> mp;
    for (int j = 0; j < H; j++) {
      mp[S[j][i]]++;
    }
    col_mp[mp]++;
  }

  if (H % 2 == 0 && W % 2 == 0) {
    for (auto itr = row_mp.begin(); itr != row_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        cout << "NO" << endl;
        return 0;
      }
    }

    for (auto itr = col_mp.begin(); itr != col_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        cout << "NO" << endl;
        return 0;
      }
    }

    if (8 <= H && H < 12 && 8 <= W && W < 12) {
      assert(false);
    }

  } else if (H % 2 == 1 && W % 2 == 0) {
    bool odd_appear = false;
    for (auto itr = row_mp.begin(); itr != row_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        if (odd_appear) {
          cout << "NO" << endl;
          return 0;
        } else {
          // この行が回文となるか確認
          bool odd = false;
          for (auto p : itr->first) {
            if (p.second % 2 == 1) {
              if (odd) {
                cout << "NO" << endl;
                return 0;
              } else {
                odd = true;
              }
            }
          }
          odd_appear = true;
        }
      }
    }

    for (auto itr = col_mp.begin(); itr != col_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        cout << "NO" << endl;
        return 0;
      }
    }
  } else if (H % 2 == 0 && W % 2 == 1) {
    for (auto itr = row_mp.begin(); itr != row_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        cout << "NO" << endl;
        return 0;
      }
    }

    bool odd_appear = false;
    for (auto itr = col_mp.begin(); itr != col_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        if (odd_appear) {
          cout << "NO" << endl;
          return 0;
        } else {
          // この列が回文となるか確認
          bool odd = false;
          for (auto p : itr->first) {
            if (p.second % 2 == 1) {
              if (odd) {
                cout << "NO" << endl;
                return 0;
              } else {
                odd = true;
              }
            }
          }
          odd_appear = true;
        }
      }
    }
  } else if (H % 2 == 1 && W % 2 == 1) {
    bool odd_appear = false;
    char center;
    for (auto itr = row_mp.begin(); itr != row_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        if (odd_appear) {
          cout << "NO" << endl;
          return 0;
        } else {
          // この行が回文となるか確認
          bool odd = false;
          for (auto p : itr->first) {
            if (p.second % 2 == 1) {
              if (odd) {
                cout << "NO" << endl;
                return 0;
              } else {
                odd = true;
                center = p.first;
              }
            }
          }
          odd_appear = true;
        }
      }
    }

    odd_appear = false;
    for (auto itr = col_mp.begin(); itr != col_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        if (odd_appear) {
          cout << "NO" << endl;
          return 0;
        } else {
          // この列が回文となるか確認
          bool odd = false;
          for (auto p : itr->first) {
            if (p.second % 2 == 1) {
              if (odd) {
                cout << "NO" << endl;
                return 0;
              } else {
                if (p.first != center) {
                  cout << "NO" << endl;
                  return 0;
                }
                odd = true;
              }
            }
          }
          odd_appear = true;
        }
      }
    }

  } else {
    assert(false);
  }

  cout << "YES" << endl;
}

Fixed submission:
#include "bits/stdc++.h"
using namespace std;

int main() {
  int H, W;
  cin >> H >> W;
  vector<string> S(H);
  for (int i = 0; i < H; i++) {
    cin >> S[i];
  }

  map<map<char, int>, int> row_mp;
  for (int i = 0; i < H; i++) {
    map<char, int> mp;
    for (char c : S[i]) {
      mp[c]++;
    }
    row_mp[mp]++;
  }

  map<map<char, int>, int> col_mp;
  for (int i = 0; i < W; i++) {
    map<char, int> mp;
    for (int j = 0; j < H; j++) {
      mp[S[j][i]]++;
    }
    col_mp[mp]++;
  }

  if (H % 2 == 0 && W % 2 == 0) {
    for (auto itr = row_mp.begin(); itr != row_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        cout << "NO" << endl;
        return 0;
      }
    }

    for (auto itr = col_mp.begin(); itr != col_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        cout << "NO" << endl;
        return 0;
      }
    }

    if (8 <= H && H < 12 && 8 <= W && W < 12) {
      cout << "NO" << endl;
      return 0;
    }

  } else if (H % 2 == 1 && W % 2 == 0) {
    bool odd_appear = false;
    for (auto itr = row_mp.begin(); itr != row_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        if (odd_appear) {
          cout << "NO" << endl;
          return 0;
        } else {
          // この行が回文となるか確認
          bool odd = false;
          for (auto p : itr->first) {
            if (p.second % 2 == 1) {
              if (odd) {
                cout << "NO" << endl;
                return 0;
              } else {
                odd = true;
              }
            }
          }
          odd_appear = true;
        }
      }
    }

    for (auto itr = col_mp.begin(); itr != col_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        cout << "NO" << endl;
        return 0;
      }
    }
  } else if (H % 2 == 0 && W % 2 == 1) {
    for (auto itr = row_mp.begin(); itr != row_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        cout << "NO" << endl;
        return 0;
      }
    }

    bool odd_appear = false;
    for (auto itr = col_mp.begin(); itr != col_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        if (odd_appear) {
          cout << "NO" << endl;
          return 0;
        } else {
          // この列が回文となるか確認
          bool odd = false;
          for (auto p : itr->first) {
            if (p.second % 2 == 1) {
              if (odd) {
                cout << "NO" << endl;
                return 0;
              } else {
                odd = true;
              }
            }
          }
          odd_appear = true;
        }
      }
    }
  } else if (H % 2 == 1 && W % 2 == 1) {
    bool odd_appear = false;
    char center;
    for (auto itr = row_mp.begin(); itr != row_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        if (odd_appear) {
          cout << "NO" << endl;
          return 0;
        } else {
          // この行が回文となるか確認
          bool odd = false;
          for (auto p : itr->first) {
            if (p.second % 2 == 1) {
              if (odd) {
                cout << "NO" << endl;
                return 0;
              } else {
                odd = true;
                center = p.first;
              }
            }
          }
          odd_appear = true;
        }
      }
    }

    odd_appear = false;
    for (auto itr = col_mp.begin(); itr != col_mp.end(); itr++) {
      if (itr->second % 2 != 0) {
        if (odd_appear) {
          cout << "NO" << endl;
          return 0;
        } else {
          // この列が回文となるか確認
          bool odd = false;
          for (auto p : itr->first) {
            if (p.second % 2 == 1) {
              if (odd) {
                cout << "NO" << endl;
                return 0;
              } else {
                if (p.first != center) {
                  cout << "NO" << endl;
                  return 0;
                }
                odd = true;
              }
            }
          }
          odd_appear = true;
        }
      }
    }

  } else {
    assert(false);
  }

  cout << "YES" << endl;
}