#include <iostream>
#include <vector>
using namespace std;
int find(vector<int> *arr, int was, int s){
int u, d, c;
u = s - 1;
d = 0;
c = d + (u - d)/2;
while (u - d > 1){
if (arr->at(c) == was){
return c;
}
else if (arr->at(c) > was){
u = c;
}
else{
d = c;
}
c = (u - d)/2 + d;
}
if (arr->at(c) == was){
return u;
}
if (arr->at(0) == was){
return 0;
}
return -1;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
vector<int> a;
vector<int> b;
int moves = 0;
int aS = 0;
int bS = 0;
int i, n;
string word;
cin >> word;
n = word.size();
for (i = 0; i < n; i++){
if (word[i] == 'a'){
a.push_back(i);
aS++;
}
else{
b.push_back(i);
bS++;
}
}
int currA, currB, pos;
for (i = 0; i < n/2; i++){
if (word[i] != word[n - 1 - i]){
if (word[i] = 'a'){
if (bS == 0 || aS == 0){
cout << -1;
return 0;
}
currB = b[0];
currA = a[aS - 1];
if (currB - i <= n - 1 - i - currA){
pos = currB;
while (pos != i){
a[find(&a, pos - 1, aS)]++;
word[pos] = 'a';
word[pos - 1] = 'b';
pos--;
moves++;
}
}
else{
pos = currA;
while (pos != i){
b[find(&b, pos + 1, bS)]--;
word[pos] = 'b';
word[pos + 1] = 'a';
pos++;
moves++;
}
}
}
else{
if (bS == 0 || aS == 0){
cout << -1;
return 0;
}
currA = a[0];
currB = b[bS - 1];
if (currA - i <= n - 1 - i - currB){
pos = currA;
while (pos != i){
b[find(&b, pos - 1, bS)]++;
word[pos] = 'b';
word[pos - 1] = 'a';
pos--;
moves++;
}
}
else{
pos = currB;
while (pos != i){
a[find(&a, pos + 1, aS)]--;
word[pos] = 'a';
word[pos + 1] = 'b';
pos++;
moves++;
}
}
}
if (a[0] == i){
a.erase(a.begin());
aS--;
}
if (a[aS - 1] == n - 1 - i){
a.pop_back();
aS--;
}
if (b[0] == i){
b.erase(b.begin());
bS--;
}
if (b[bS - 1] == n - 1 - i){
b.pop_back();
bS--;
}
}
}
cout << moves;
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | #include <iostream> #include <vector> using namespace std; int find(vector<int> *arr, int was, int s){ int u, d, c; u = s - 1; d = 0; c = d + (u - d)/2; while (u - d > 1){ if (arr->at(c) == was){ return c; } else if (arr->at(c) > was){ u = c; } else{ d = c; } c = (u - d)/2 + d; } if (arr->at(c) == was){ return u; } if (arr->at(0) == was){ return 0; } return -1; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); vector<int> a; vector<int> b; int moves = 0; int aS = 0; int bS = 0; int i, n; string word; cin >> word; n = word.size(); for (i = 0; i < n; i++){ if (word[i] == 'a'){ a.push_back(i); aS++; } else{ b.push_back(i); bS++; } } int currA, currB, pos; for (i = 0; i < n/2; i++){ if (word[i] != word[n - 1 - i]){ if (word[i] = 'a'){ if (bS == 0 || aS == 0){ cout << -1; return 0; } currB = b[0]; currA = a[aS - 1]; if (currB - i <= n - 1 - i - currA){ pos = currB; while (pos != i){ a[find(&a, pos - 1, aS)]++; word[pos] = 'a'; word[pos - 1] = 'b'; pos--; moves++; } } else{ pos = currA; while (pos != i){ b[find(&b, pos + 1, bS)]--; word[pos] = 'b'; word[pos + 1] = 'a'; pos++; moves++; } } } else{ if (bS == 0 || aS == 0){ cout << -1; return 0; } currA = a[0]; currB = b[bS - 1]; if (currA - i <= n - 1 - i - currB){ pos = currA; while (pos != i){ b[find(&b, pos - 1, bS)]++; word[pos] = 'b'; word[pos - 1] = 'a'; pos--; moves++; } } else{ pos = currB; while (pos != i){ a[find(&a, pos + 1, aS)]--; word[pos] = 'a'; word[pos + 1] = 'b'; pos++; moves++; } } } if (a[0] == i){ a.erase(a.begin()); aS--; } if (a[aS - 1] == n - 1 - i){ a.pop_back(); aS--; } if (b[0] == i){ b.erase(b.begin()); bS--; } if (b[bS - 1] == n - 1 - i){ b.pop_back(); bS--; } } } cout << moves; return 0; } |
English