Problem p03618 (C++)

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

#define OUT(x) cerr << #x << " = " << x << endl;
#define all(x) x.begin(), x.end()
#define mp make_pair
#define pii pair<int, int>
#define pll pair<long long, long long>
#define ll long long

// long long extgcd(long long a, long long b, long long& x, long long& y) {
// //拡張gcdによる逆元
//         long long d = a;
//         if (b != 0) {
//                 d = extgcd(b, a % b, y, x);
//                 y -= (a / b) * x;
//         } else {
//                 x = 1;
//                 y = 0;
//         }
//         return d;
// }
// long long inv(long long a) {
//         long long x, y;
//         extgcd(a, MOD, x, y);
//         return (x % MOD + MOD) % MOD;
// }
// long long inv(long long a) { //フェルマーの小定理と繰り返し2乗法による逆元
//         long long res = 1;
//         long long n = MOD - 2;
//         while (n > 0) {
//                 if (n & 1) res = res * a % MOD;
//                 a = a * a % MOD;
//                 n >>= 1;
//         }
//         return res;
// }
//
// long long nCr(long long n, long long r) {
//         if (n < r) return 0;
//         if (n - r < r) r = n - r;
//         long long ret = 1;
//         for (int i = 0; i < r; i ++) {
//                 ret = ret * n % MOD;
//                 n --;
//                 ret = ret * inv(i + 1) % MOD;
//         }
//         return ret;
// }
long long fact[202020];
long long nCr(long long n, long long r) {
  long long ans = fact[n];
  ans /= fact[r] * fact[n - r];
  return ans;
}

// long long nHr(long long n, long long r) {
// //n個のものから重複を許してr個をとる場合の数
//         return nCr(n + r - 1, r);
// }

void init() {
  fact[0] = 1;
  for (int i = 1; i < 202020; i++)
    fact[i] = fact[i - 1] * i;
}

int main() {
  init();
  string s;
  cin >> s;
  vector<long long> cnt(26, 0);
  long long n = s.size();
  for (int i = 0; i < n; i++) {
    cnt[s[i] - 'a']++;
  }
  long long ans = 1;
  ans += n * (n - 1) / 2;
  for (int i = 0; i < 26; i++) {
    if (cnt[i] < 2)
      continue;
    ans -= nCr(cnt[i], 2);
  }
  cout << ans << endl;
  return 0;
}


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

#define OUT(x) cerr << #x << " = " << x << endl;
#define all(x) x.begin(), x.end()
#define mp make_pair
#define pii pair<int, int>
#define pll pair<long long, long long>
#define ll long long

// long long extgcd(long long a, long long b, long long& x, long long& y) {
// //拡張gcdによる逆元
//         long long d = a;
//         if (b != 0) {
//                 d = extgcd(b, a % b, y, x);
//                 y -= (a / b) * x;
//         } else {
//                 x = 1;
//                 y = 0;
//         }
//         return d;
// }
// long long inv(long long a) {
//         long long x, y;
//         extgcd(a, MOD, x, y);
//         return (x % MOD + MOD) % MOD;
// }
// long long inv(long long a) { //フェルマーの小定理と繰り返し2乗法による逆元
//         long long res = 1;
//         long long n = MOD - 2;
//         while (n > 0) {
//                 if (n & 1) res = res * a % MOD;
//                 a = a * a % MOD;
//                 n >>= 1;
//         }
//         return res;
// }
//
// long long nCr(long long n, long long r) {
//         if (n < r) return 0;
//         if (n - r < r) r = n - r;
//         long long ret = 1;
//         for (int i = 0; i < r; i ++) {
//                 ret = ret * n % MOD;
//                 n --;
//                 ret = ret * inv(i + 1) % MOD;
//         }
//         return ret;
// }
long long fact[202020];
long long nCr(long long n, long long r) {
  long long ans = fact[n];
  ans /= fact[r] * fact[n - r];
  return ans;
}

// long long nHr(long long n, long long r) {
// //n個のものから重複を許してr個をとる場合の数
//         return nCr(n + r - 1, r);
// }

void init() {
  fact[0] = 1;
  for (int i = 1; i < 202020; i++)
    fact[i] = fact[i - 1] * i;
}

int main() {
  init();
  string s;
  cin >> s;
  vector<long long> cnt(26, 0);
  long long n = s.size();
  for (int i = 0; i < n; i++) {
    cnt[s[i] - 'a']++;
  }
  long long ans = 1;
  ans += n * (n - 1) / 2;
  for (int i = 0; i < 26; i++) {
    if (cnt[i] < 2)
      continue;
    ans -= cnt[i] * (cnt[i] - 1) / 2;
  }
  cout << ans << endl;
  return 0;
}