

题意:
定义Hamming距离为两字符串间对应的字符差值绝对值的和, 求a与b的所有等长度子串的hamming距离之和。
思路:
分析样例可以推出:
字符串a和字符串b的hamming距离就是:
∑i=1∣a∣dis(a[i],[b[i],b[∣b∣−∣a∣+i]])\sum_{i=1}^{|a|} dis(a[i],[b[i],b[|b|-|a|+i]])i=1∑∣a∣dis(a[i],[b[i],b[∣b∣−∣a∣+i]])
a字符串中的第一个元素,分别与b字符串中的第一个元素至第|b|-|a|+1个元素求距离的和,
再加上a字符串中的第2个元素,分别与b字符串中的第2个元素至第|b|-|a|+2个元素求距离的和
…
直到a字符串中的第|a|个元素与b字符串中的第|a|个元素至第|b|个元素求距离的总和.
我们用cnt[i]cnt[i]cnt[i]保存字符串b的前i个元素和,也就是1的个数,那么前i个元素0的个数就是i−cnt[i]i-cnt[i]i−cnt[i]
如果(a[i]==0),那么我们把答案加上区间[b[i],b[∣b∣−∣a∣+i]][b[i],b[|b|-|a|+i]][b[i],b[∣b∣−∣a∣+i]]里1的个数,反之同理。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
char a[maxn],b[maxn];
ll cnt[maxn];
int main(){
cin>>(a+1)>>(b+1);
ll lena=strlen(a+1),lenb=strlen(b+1),ans=0;
for(int i=1;i<=lenb;i++) cnt[i] = cnt[i-1]+b[i]-'0';
for(int i=1;i<=lena;i++){
if(a[i]=='0') ans+=cnt[lenb-lena+i]-cnt[i-1];
else ans+=lenb-lena+1-(cnt[lenb-lena+i]-cnt[i-1]);
}
cout<<ans<<endl;
}
本文介绍了一种求解两字符串所有等长度子串Hamming距离之和的算法,通过预处理计数数组,实现快速计算,适用于字符串匹配与相似度分析。
928

被折叠的 条评论
为什么被折叠?



