#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int n,how_many_a,how_many_b;
ll res=0;
string s;
set<int>ocur_ap,ocur_bp,ocur_an,ocur_bn;
void solve(){
string str='0'+s;
int half=n/2;
set<int>::const_iterator iter1,iter2;
int it1,it2;
for(int i=1;i<=half;++i)
if(str[i]!=str[n-i+1]){
if(str[i]=='a'){
iter1=ocur_bp.upper_bound(i);
iter2=ocur_an.upper_bound(-n+i-1);
it1=*iter1;
it2=-(*iter2);
if(it1-i<=n-i+1-it2){
res+=it1-i;
str[i]='b';
str[it1]='a';
ocur_ap.erase(i);
ocur_ap.insert(it1);
ocur_bp.erase(it1);
ocur_bp.insert(i);
ocur_an.erase(-i);
ocur_an.insert(-it1);
ocur_bn.erase(-it1);
ocur_bn.insert(-i);
}
else{
res+=n-i+1-it2;
str[n-i+1]='a';
str[it2]='b';
ocur_bp.erase(n-i+1);
ocur_bp.insert(it2);
ocur_ap.erase(it2);
ocur_ap.insert(n-i+1);
ocur_bn.erase(-n+i-1);
ocur_bn.insert(-it2);
ocur_an.erase(-it2);
ocur_an.insert(-n+i-1);
}
}
else if(str[i]=='b'){
iter1=ocur_ap.upper_bound(i);
iter2=ocur_bn.upper_bound(-n+i-1);
it1=*iter1;
it2=-(*iter2);
if(it1-i<=n-i+1-it2){
res+=it1-i;
str[i]='a';
str[it1]='b';
ocur_bp.erase(i);
ocur_bp.insert(it1);
ocur_ap.erase(it1);
ocur_ap.insert(i);
ocur_bn.erase(-i);
ocur_bn.insert(-it1);
ocur_an.erase(-it1);
ocur_an.insert(-i);
}
else{
res+=n-i+1-it2;
str[n-i+1]='b';
str[it2]='a';
ocur_ap.erase(n-i+1);
ocur_ap.insert(it2);
ocur_bp.erase(it2);
ocur_bp.insert(n-i+1);
ocur_an.erase(-n+i-1);
ocur_an.insert(-it2);
ocur_bn.erase(-it2);
ocur_bn.insert(-n+i-1);
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>s;
n=s.size();
for(int i=0;i<n;++i){
if(s[i]=='a')
++how_many_a;
else
++how_many_b;
}
if((how_many_a&1 and how_many_b&1) or (n%2==0 and (how_many_a&1 or how_many_b&1))){
cout<<-1;
exit(0);
}
for(int i=0;i<n;++i){
if(s[i]=='a') ocur_ap.insert(i+1),ocur_an.insert(-i-1);
else ocur_bp.insert(i+1),ocur_bn.insert(-i-1);
}
solve();
cout<<res;
}
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 | #include<bits/stdc++.h> using namespace std; using ll=long long; int n,how_many_a,how_many_b; ll res=0; string s; set<int>ocur_ap,ocur_bp,ocur_an,ocur_bn; void solve(){ string str='0'+s; int half=n/2; set<int>::const_iterator iter1,iter2; int it1,it2; for(int i=1;i<=half;++i) if(str[i]!=str[n-i+1]){ if(str[i]=='a'){ iter1=ocur_bp.upper_bound(i); iter2=ocur_an.upper_bound(-n+i-1); it1=*iter1; it2=-(*iter2); if(it1-i<=n-i+1-it2){ res+=it1-i; str[i]='b'; str[it1]='a'; ocur_ap.erase(i); ocur_ap.insert(it1); ocur_bp.erase(it1); ocur_bp.insert(i); ocur_an.erase(-i); ocur_an.insert(-it1); ocur_bn.erase(-it1); ocur_bn.insert(-i); } else{ res+=n-i+1-it2; str[n-i+1]='a'; str[it2]='b'; ocur_bp.erase(n-i+1); ocur_bp.insert(it2); ocur_ap.erase(it2); ocur_ap.insert(n-i+1); ocur_bn.erase(-n+i-1); ocur_bn.insert(-it2); ocur_an.erase(-it2); ocur_an.insert(-n+i-1); } } else if(str[i]=='b'){ iter1=ocur_ap.upper_bound(i); iter2=ocur_bn.upper_bound(-n+i-1); it1=*iter1; it2=-(*iter2); if(it1-i<=n-i+1-it2){ res+=it1-i; str[i]='a'; str[it1]='b'; ocur_bp.erase(i); ocur_bp.insert(it1); ocur_ap.erase(it1); ocur_ap.insert(i); ocur_bn.erase(-i); ocur_bn.insert(-it1); ocur_an.erase(-it1); ocur_an.insert(-i); } else{ res+=n-i+1-it2; str[n-i+1]='b'; str[it2]='a'; ocur_ap.erase(n-i+1); ocur_ap.insert(it2); ocur_bp.erase(it2); ocur_bp.insert(n-i+1); ocur_an.erase(-n+i-1); ocur_an.insert(-it2); ocur_bn.erase(-it2); ocur_bn.insert(-n+i-1); } } } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin>>s; n=s.size(); for(int i=0;i<n;++i){ if(s[i]=='a') ++how_many_a; else ++how_many_b; } if((how_many_a&1 and how_many_b&1) or (n%2==0 and (how_many_a&1 or how_many_b&1))){ cout<<-1; exit(0); } for(int i=0;i<n;++i){ if(s[i]=='a') ocur_ap.insert(i+1),ocur_an.insert(-i-1); else ocur_bp.insert(i+1),ocur_bn.insert(-i-1); } solve(); cout<<res; } |
English