Problem p02947 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <array>
#include <assert.h>
#include <bitset>
#include <cmath> // 変数名にy1が使えなくなるかも…。
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

typedef __int128_t int128_t;
std::istream &
operator>>(std::istream &input,
           int128_t &value) { // int128_tの入力。入力が64bitに収まる前提。
  long long tmp;
  input >> tmp;
  value = tmp;
  return input;
}
std::ostream &
operator<<(std::ostream &output,
           const int128_t value) { // int128_tの出力。出力が64bitに収まる前提。
  output << (long long)value;
  return output;
}

// 文字列Sに各文字が何回出現するかカウント。始まりの文字がcで、文字種類数がk
// 例えばSに含まれる文字が'a-z'であれば、c='a', k=26とする。
std::vector<int> count_char(const std::string &S, const char c, const int k) {
  std::vector<int> ret;
  ret.resize(k, 0);
  for (int i = 0; i < S.size(); i++) {
    assert(S[i] - c < k);
    ret[S[i] - c]++;
  }
  return ret;
}

#define rep(i, begin, end) for (int64_t i = (begin); i <= (end); i++)
#define rev(i, begin, end) for (int64_t i = (begin); (end) <= i; i--)

void printvec(const std::vector<int> &vec) {
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i] << " ";
  }
  std::cout << std::endl;
}

const int MAX_N = 12;
int N;
std::string S[MAX_N];
std::map<std::string, int128_t> mp;

int main(int argc, char **argv) {
  std::cin >> N;
  rep(i, 1, N) {
    std::cin >> S[i];
    std::sort(S[i].begin(), S[i].end());
    mp[S[i]]++;
  }

  int128_t ret = 0;
  for (auto p : mp) {
    ret += (p.second * (p.second - 1)) / 2;
  }

  std::cout << ret << std::endl;

  return 0;
}

Fixed submission:
#include <algorithm>
#include <array>
#include <assert.h>
#include <bitset>
#include <cmath> // 変数名にy1が使えなくなるかも…。
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

typedef __int128_t int128_t;
std::istream &
operator>>(std::istream &input,
           int128_t &value) { // int128_tの入力。入力が64bitに収まる前提。
  long long tmp;
  input >> tmp;
  value = tmp;
  return input;
}
std::ostream &
operator<<(std::ostream &output,
           const int128_t value) { // int128_tの出力。出力が64bitに収まる前提。
  output << (long long)value;
  return output;
}

// 文字列Sに各文字が何回出現するかカウント。始まりの文字がcで、文字種類数がk
// 例えばSに含まれる文字が'a-z'であれば、c='a', k=26とする。
std::vector<int> count_char(const std::string &S, const char c, const int k) {
  std::vector<int> ret;
  ret.resize(k, 0);
  for (int i = 0; i < S.size(); i++) {
    assert(S[i] - c < k);
    ret[S[i] - c]++;
  }
  return ret;
}

#define rep(i, begin, end) for (int64_t i = (begin); i <= (end); i++)
#define rev(i, begin, end) for (int64_t i = (begin); (end) <= i; i--)

void printvec(const std::vector<int> &vec) {
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i] << " ";
  }
  std::cout << std::endl;
}

const int MAX_N = 1e5 + 10;
int N;
std::string S[MAX_N];
std::map<std::string, int128_t> mp;

int main(int argc, char **argv) {
  std::cin >> N;
  rep(i, 1, N) {
    std::cin >> S[i];
    std::sort(S[i].begin(), S[i].end());
    mp[S[i]]++;
  }

  int128_t ret = 0;
  for (auto p : mp) {
    ret += (p.second * (p.second - 1)) / 2;
  }

  std::cout << ret << std::endl;

  return 0;
}