// Author: Bartek Knapik #include <cstdio> char input[200200]; int cnt[2]; struct my_vect { int entries[200200]; int begin; int end; my_vect() { this->begin = this->end = 0; } void push(int val) { entries[end++] = val; } void pop_b() { begin++; } void pop_e() { end--; } int len() { return end - begin; } int &operator[](int pos) { return entries[begin + pos]; } }; my_vect apos, bpos, xa, xb; long long solve() { scanf("%s", input); cnt[0] = cnt[1] = 0; int len; for (len = 0; input[len]; ++len) cnt[input[len] - 'a']++; if ((cnt[0] & 1) && (cnt[1] & 1)) return -1LL; for (len = 0; input[len]; ++len) { if (input[len] == 'a') apos.push(len); else bpos.push(len); } long long res = 0LL; while (apos.len() && bpos.len()) { if (apos.len() == 1) { while (xa.len() && xa[0] >= bpos[bpos.len() / 2]) xa.pop_b(); res += 1LL * bpos[bpos.len() / 2] - 1LL * apos[0] - 1LL * xa.len() - 1LL; return res; } if (bpos.len() == 1) { while (xb.len() && xb[0] >= apos[apos.len() / 2]) xb.pop_b(); res += 1LL * apos[apos.len() / 2] - 1LL * bpos[0] - 1LL * xb.len() - 1LL; return res; } if (apos[0] < bpos[0]) { if (apos[apos.len() - 1] < bpos[bpos.len() - 1]) { res += 1LL * bpos[bpos.len() - 1] - 1LL * apos[apos.len() - 1] - 1LL * xa.len(); xa.push(apos[apos.len() - 1]); } apos.pop_b(); apos.pop_e(); while (xb.len() && xb[0] > apos[apos.len() - 1]) xb.pop_b(); } else { if (apos[apos.len() - 1] > bpos[bpos.len() - 1]) { res += 1LL * apos[apos.len() - 1] - 1LL * bpos[bpos.len() - 1] - 1LL * xb.len(); xb.push(bpos[bpos.len() - 1]); } bpos.pop_b(); bpos.pop_e(); while (xa.len() && xa[0] > bpos[bpos.len() - 1]) xa.pop_b(); } } return res; } int main() { printf("%lld\n", solve()); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | // Author: Bartek Knapik #include <cstdio> char input[200200]; int cnt[2]; struct my_vect { int entries[200200]; int begin; int end; my_vect() { this->begin = this->end = 0; } void push(int val) { entries[end++] = val; } void pop_b() { begin++; } void pop_e() { end--; } int len() { return end - begin; } int &operator[](int pos) { return entries[begin + pos]; } }; my_vect apos, bpos, xa, xb; long long solve() { scanf("%s", input); cnt[0] = cnt[1] = 0; int len; for (len = 0; input[len]; ++len) cnt[input[len] - 'a']++; if ((cnt[0] & 1) && (cnt[1] & 1)) return -1LL; for (len = 0; input[len]; ++len) { if (input[len] == 'a') apos.push(len); else bpos.push(len); } long long res = 0LL; while (apos.len() && bpos.len()) { if (apos.len() == 1) { while (xa.len() && xa[0] >= bpos[bpos.len() / 2]) xa.pop_b(); res += 1LL * bpos[bpos.len() / 2] - 1LL * apos[0] - 1LL * xa.len() - 1LL; return res; } if (bpos.len() == 1) { while (xb.len() && xb[0] >= apos[apos.len() / 2]) xb.pop_b(); res += 1LL * apos[apos.len() / 2] - 1LL * bpos[0] - 1LL * xb.len() - 1LL; return res; } if (apos[0] < bpos[0]) { if (apos[apos.len() - 1] < bpos[bpos.len() - 1]) { res += 1LL * bpos[bpos.len() - 1] - 1LL * apos[apos.len() - 1] - 1LL * xa.len(); xa.push(apos[apos.len() - 1]); } apos.pop_b(); apos.pop_e(); while (xb.len() && xb[0] > apos[apos.len() - 1]) xb.pop_b(); } else { if (apos[apos.len() - 1] > bpos[bpos.len() - 1]) { res += 1LL * apos[apos.len() - 1] - 1LL * bpos[bpos.len() - 1] - 1LL * xb.len(); xb.push(bpos[bpos.len() - 1]); } bpos.pop_b(); bpos.pop_e(); while (xa.len() && xa[0] > bpos[bpos.len() - 1]) xa.pop_b(); } } return res; } int main() { printf("%lld\n", solve()); return 0; } |