CF356B - Xenia and Hamming 题解
题目链接:https://codeforces.com/problemset/problem/356/B
题目大意:
字符串 是字符串 循环 次(),
字符串 是字符串 循环 次()。
字符串 和 长度相同,求字符串 和 存在多少个字符不相同。
解题思路(参考自:官方题解):
让我们定义第一个字符串 的长度为 ,第二个字符串 的长度为 。令 。很明显 是字符串 和 的一个循环节,所以我们可以计算两个字符串的长度为 的前缀的汉明距离,计算的结果再乘上 就是最终的答案了。
对于字符串 中的任意位置 ,我们可以思考 中的下标 能够对应 中的哪些下标 。
很容易证明:若定义 ,则当 ,则 将和 作比较。
对于任意一个位置除以 的余数,以及任意一个字符 我们可以计算得到 ,它在字符串 中存在多少个下标 满足 且对应下标 对应的字符为 。
当计算(前面长度为 的)汉明距离时, 将和恰好 个字符对应的位置相等且字符也相等,其余位置都是不相等的。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int cnt[maxn][26];
long long n, m, lenX, lenY, L, g, ans;
char x[maxn], y[maxn];
int main() {
scanf("%lld%lld%s%s", &n, &m, x, y);
lenX = strlen(x);
lenY = strlen(y);
g = __gcd(lenX, lenY);
L = lenX * lenY / g;
for (int i = 0; i < lenY; i++)
cnt[i%g][y[i]-'a']++;
ans = L;
for (int i = 0; i < lenX; i++)
ans -= cnt[i%g][x[i]-'a'];
printf("%lld\n", ans * (n * lenX / L));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现