题解:AT_agc052_e [AGC052E] 3 Letters
题意:给定两个长度为
设整数数列
我们发现,若操作
通过贪心的证明,我们容易证明
这个问题十分简单,如图,蓝线和橙线分别代表
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e5 + 5;
int n, a[N], b[N], c[100][100], d, ans, p[N], q[N];
string s, t;
signed main(){
cin >> n >> s >> t, s = "@" + s, t = "@" + t;
c['A']['B'] = 1, c['A']['C'] = -1;
c['B']['C'] = 1, c['B']['A'] = -1;
c['C']['A'] = 1, c['C']['B'] = -1;
a[1] = s[1] % 3;
for(int i = 2; i <= n; i++)
a[i] = a[i - 1] + c[s[i - 1]][s[i]];
b[1] = t[1] % 3;
for(int i = 2; i <= n; i++)
b[i] = b[i - 1] + c[t[i - 1]][t[i]];
for(int i = 1; i <= n; i++) p[i] = q[i] = i;
sort(p + 1, p + 1 + n, [](int x, int y){return a[x] < a[y];});
sort(q + 1, q + 1 + n, [](int x, int y){return b[x] < b[y];});
int d = a[p[(n + 1) / 2]] - b[q[(n + 1) / 2]], mn = 1e18;
for(int e = d / 3 * 3 - 18; e <= d / 3 * 3 + 18; e += 3){
if(((b[1] + e) ^ a[1]) & 1) continue;
ans = 0;
for(int i = 1; i <= n; i++)
ans += abs(a[i] - b[i] - e);
mn = min(mn, ans);
}
cout << mn / 2;
return 0;
}