Problem p03483 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#define REP(i, a, n) for (int i = a; i <= n; ++i)
#define PER(i, a, n) for (int i = n; i >= a; --i)
#define hr putchar(10)
#define pb push_back
#define lc (o << 1)
#define rc (lc | 1)
#define mid ((l + r) >> 1)
#define ls lc, l, mid
#define rs rc, mid + 1, r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a)                                                                  \
  ({                                                                           \
    REP(__i, 1, n) cout << a[__i] << ' ';                                      \
    hr;                                                                        \
  })
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int P = 1e9 + 7, INF = 0x3f3f3f3f;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll qpow(ll a, ll n) {
  ll r = 1 % P;
  for (a %= P; n; a = a * a % P, n >>= 1)
    if (n & 1)
      r = r * a % P;
  return r;
}
ll inv(ll x) { return x <= 1 ? 1 : inv(P % x) * (P - P / x) % P; }
inline int rd() {
  int x = 0;
  char p = getchar();
  while (p < '0' || p > '9')
    p = getchar();
  while (p >= '0' && p <= '9')
    x = x * 10 + p - '0', p = getchar();
  return x;
}
// head

const int N = 50;
int n, vis[N], c[N];
char s[N];
vector<int> g[N];
void add(int x, int v) {
  for (; x <= n; x += x & -x)
    c[x] += v;
}
int qry(int x) {
  int r = 0;
  for (; x; x ^= x & -x)
    r += c[x];
  return r;
}
int main() {
  while (~scanf("%s", s + 1)) {
    n = strlen(s + 1);
    int d = 0;
    REP(i, 0, 1) g[i].clear();
    REP(i, 1, n) c[i] = 0, vis[i] = 0;
    REP(i, 1, n) s[i] -= 'a', d ^= 1 << s[i], g[s[i]].pb(i);
    if (d & (d - 1)) {
      cout << -1 << endl;
      continue;
    }
    ll ans = 0;
    int now = n;
    REP(i, 1, n) if (!vis[i]) {
      int nxt = g[s[i]].back();
      g[s[i]].pop_back();
      int x = nxt - qry(nxt);
      if (i == nxt)
        ans += max((n + 1) / 2 - x, 0);
      else
        ans += max(now-- - x, 0), add(nxt + 1, 1);
      vis[nxt] = 1;
    }
    printf("%lld\n", ans);
  }
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#define REP(i, a, n) for (int i = a; i <= n; ++i)
#define PER(i, a, n) for (int i = n; i >= a; --i)
#define hr putchar(10)
#define pb push_back
#define lc (o << 1)
#define rc (lc | 1)
#define mid ((l + r) >> 1)
#define ls lc, l, mid
#define rs rc, mid + 1, r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a)                                                                  \
  ({                                                                           \
    REP(__i, 1, n) cout << a[__i] << ' ';                                      \
    hr;                                                                        \
  })
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int P = 1e9 + 7, INF = 0x3f3f3f3f;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll qpow(ll a, ll n) {
  ll r = 1 % P;
  for (a %= P; n; a = a * a % P, n >>= 1)
    if (n & 1)
      r = r * a % P;
  return r;
}
ll inv(ll x) { return x <= 1 ? 1 : inv(P % x) * (P - P / x) % P; }
inline int rd() {
  int x = 0;
  char p = getchar();
  while (p < '0' || p > '9')
    p = getchar();
  while (p >= '0' && p <= '9')
    x = x * 10 + p - '0', p = getchar();
  return x;
}
// head

const int N = 1e6 + 10;
int n, vis[N], c[N];
char s[N];
vector<int> g[N];
void add(int x, int v) {
  for (; x <= n; x += x & -x)
    c[x] += v;
}
int qry(int x) {
  int r = 0;
  for (; x; x ^= x & -x)
    r += c[x];
  return r;
}
int main() {
  while (~scanf("%s", s + 1)) {
    n = strlen(s + 1);
    int d = 0;
    REP(i, 0, 1) g[i].clear();
    REP(i, 1, n) c[i] = 0, vis[i] = 0;
    REP(i, 1, n) s[i] -= 'a', d ^= 1 << s[i], g[s[i]].pb(i);
    if (d & (d - 1)) {
      cout << -1 << endl;
      continue;
    }
    ll ans = 0;
    int now = n;
    REP(i, 1, n) if (!vis[i]) {
      int nxt = g[s[i]].back();
      g[s[i]].pop_back();
      int x = nxt - qry(nxt);
      if (i == nxt)
        ans += max((n + 1) / 2 - x, 0);
      else
        ans += max(now-- - x, 0), add(nxt + 1, 1);
      vis[nxt] = 1;
    }
    printf("%lld\n", ans);
  }
}