兩字符串 a、b,長度分別 la, lb。構造長度為 L = lcm(la,lb) 的超級串:a 重複 L/la 次,b 重複 L/lb 次。求兩超級串**漢明距離**(對應位置字符不同的個數)。最終答案乘以 n(a 的重複次數)。
在一個 LCM 週期內,a 的位置 i 僅與 b 的位置 j 配對,其中 i ≡ j (mod g),g = gcd(la,lb)。
且每對 (i,j) **恰好配對一次**。
#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int64 n, m; string a, b;
cin >> n >> m >> a >> b;
int la = a.size(), lb = b.size();
int g = std::gcd(la, lb);
int64 L = 1LL * la / g * lb;
vector> cntA(g), cntB(g);
for (int i = 0; i < la; ++i) cntA[i % g][a[i]-'a']++;
for (int i = 0; i < lb; ++i) cntB[i % g][b[i]-'a']++;
int64 match = 0;
for (int r = 0; r < g; ++r)
for (int c = 0; c < 26; ++c)
match += 1LL * cntA[r][c] * cntB[r][c];
int64 periodHam = L - match;
int64 ans = (n * la / L) * periodHam;
cout << ans << '\n';
return 0;
}
O(la+lb+g×26),線性極快。