#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; } |