题意:
定义Hamming距离为两字符串间对应的字符差值绝对值的和, 求a与b的所有等长度子串的hamming距离之和。
思路:
分析样例可以推出:
字符串a和字符串b的hamming距离就是:
∑
i
=
1
∣
a
∣
d
i
s
(
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|个元素求距离的总和.
我们用
c
n
t
[
i
]
cnt[i]
cnt[i]保存字符串b的前i个元素和,也就是1的个数,那么前i个元素0的个数就是
i
−
c
n
t
[
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;
}