string s; while (cin >> s) { int cnt[256] = {0}; for (char c : s) { ++cnt[c]; }
string d = "BAT"; sort(d.begin(), d.end());
int min_d = s.size(); // 最小的字符不同数 string min_s; // 最后的形态 do { int k = 0, diff = 0; for (int i = 0; i < 3; ++i) { for (int j = 0; j < cnt[d[i]]; ++j, ++k) { if (s[k] != d[i]) { ++diff; } } } if (diff < min_d) { min_d = diff; min_s = d; } } while(next_permutation(d.begin(), d.end())); // BAT的全排列
int part_cnt[3][256] = {0}; for (int i = 0, k = 0; i < 3; ++i) { for (int j = 0; j < cnt[min_s[i]]; ++j, ++k) { ++part_cnt[i][s[k]]; } }
int ans = min_d; int left = 0; // 剩下需要3个分区一起交换的字符 for (int i = 0; i < 3; ++i) { for (int j = 0; j < i; ++j) { ans -= min(part_cnt[i][min_s[j]], part_cnt[j][min_s[i]]); // 减去可以两两交换同时到达各自位置的字符 left += abs(part_cnt[i][min_s[j]] - part_cnt[j][min_s[i]]); // 加上不能两两交换同时到达的字符 } } ans -= (left / 3); // 3个字符够成一个环 cout << ans << endl; }