[AGC052E] 3 Letters 题解
妙妙题。
思路#
我们考虑将一个字符串
我们要求:
- 当
- 当
- 当
那么发现,由于
那么当我们
考虑修改。
我们在修改一个字符的时候,要求两侧的字符相同,并都与中间的不同。
在序列上的表示即为:
那么我们只能把
因此我们的操作就是每一次给一个数加减二。
然后我们考虑在这种操作下,我们怎样把两个数值的序列
首先,对于每一个位置,两个数的奇偶性要一样,否则就无解。
有一个比较简单的下界是:
我们可以证明能够达到这个下界,具体的我们一定可以找到一个位置将其距离缩小二。
然后我们就把字符串距离转化为了序列的距离了。
我们考虑对两个字符串都固定一个序列。
由于两个都固定没有意义,我们可以将一个随意处理。
比如我们知道了
现在需要构造
由于
那么可以令:
相当于我们求出任意一个
考虑此时的贡献:
那么只要求
Code#
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[500010];
int b[500010];
string s;
string t;
inline int calc(int x) {
int res = 0;
for (int i = 1; i <= n; i++)
res += abs(a[i] - x) / 2;
return res;
}
signed main() {
cin >> n >> s >> t;
if (s[0] == 'A') a[1] = 1;
if (s[0] == 'B') a[1] = 2;
if (s[0] == 'C') a[1] = 3;
for (int i = 2; i <= n; i++) {
if (s[i - 2] == 'A') a[i] = a[i - 1] + (s[i - 1] == 'B' ? 1 : -1);
if (s[i - 2] == 'B') a[i] = a[i - 1] + (s[i - 1] == 'C' ? 1 : -1);
if (s[i - 2] == 'C') a[i] = a[i - 1] + (s[i - 1] == 'A' ? 1 : -1);
}
if (t[0] == 'A') b[1] = 1;
if (t[0] == 'B') b[1] = 2;
if (t[0] == 'C') b[1] = 3;
for (int i = 2; i <= n; i++) {
if (t[i - 2] == 'A') b[i] = b[i - 1] + (t[i - 1] == 'B' ? 1 : -1);
if (t[i - 2] == 'B') b[i] = b[i - 1] + (t[i - 1] == 'C' ? 1 : -1);
if (t[i - 2] == 'C') b[i] = b[i - 1] + (t[i - 1] == 'A' ? 1 : -1);
}
if (a[1] % 2 != b[1] % 2) {
for (int i = 1; i <= n; i++) b[i] += 3;
}
for (int i = 1; i <= n; i++) a[i] -= b[i];
sort(a + 1, a + n + 1);
int w = a[n / 2 + 1] / 6 * 6;
int s = 1e18;
for (int i = -5; i <= 5; i++)
s = min(s, calc(w + i * 6));
cout << s << "\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)