[AGC052E] 3 Letters 题解

妙妙题。

思路#

我们考虑将一个字符串 s 看作一个序列 a

我们要求:

  1. si=a,ai1(mod3)
  2. si=b,ai2(mod3)
  3. si=c,ai0(mod3)

那么发现,由于 s 中相邻字符都不相同,也就意味着 |aiai1|=1

那么当我们 sa1 确定后,整个 a 序列就确定了。

考虑修改。

我们在修改一个字符的时候,要求两侧的字符相同,并都与中间的不同。

在序列上的表示即为:

x,x+1/x1,x

那么我们只能把 x+1x1 互相变化。

因此我们的操作就是每一次给一个数加减二。

然后我们考虑在这种操作下,我们怎样把两个数值的序列 a,b 变得相同。

首先,对于每一个位置,两个数的奇偶性要一样,否则就无解。

有一个比较简单的下界是:i=1n|biai|2

我们可以证明能够达到这个下界,具体的我们一定可以找到一个位置将其距离缩小二。

然后我们就把字符串距离转化为了序列的距离了。

我们考虑对两个字符串都固定一个序列。

由于两个都固定没有意义,我们可以将一个随意处理。

比如我们知道了 sa 序列。

现在需要构造 tb 序列。

由于 b1,a1 的奇偶性相同,也要和第一个字符模三一样。

那么可以令:

b1=x+6×k

相当于我们求出任意一个 b 后可以将它全部偏移 6×k

考虑此时的贡献:

(1)=i=1n|(aibi)+6×k|2(2)=i=1n|(biai)6×k|2

那么只要求 biai 的中位数,求能取到最优的答案。

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

作者:JiaY19

出处:https://www.cnblogs.com/JiaY19/p/18452066

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   JiaY19  阅读(8)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示