http://codeforces.com/contest/608/problem/B
给a,b串,求a和 【b的所有长度为len(a)的连续子串的】的 Hamming Distance之和
用整体法来看,b的每一个位置b[i]会被多少个a[i]访问到,记为mm,
那么 这些能访问到b[i]的mm个数里面有多少个是1,记为one,
如果b[i]==1,那么sum+= mm-one
否则 sum+=one;
至于这个one 就用前缀和算就好了
答案为sum
注意答案是int64
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <stack> #include <vector> #include <iostream> using namespace std; char tm[200005]; char ss[200005]; __int64 one[200005]; int main() { int i,j,k; int t1,t2; int m; int n; scanf("%s",tm+1); getchar(); scanf("%s",ss+1); __int64 len1=strlen(tm+1); __int64 len2=strlen(ss+1); for (i=1;i<=len2;i++) { if (ss[i]=='1') one[i]=one[i-1]+1; else one[i]=one[i-1]; } __int64 sum=0; for (i=1;i<=len1;i++) { if (tm[i]=='1') sum+= len2-len1+1-(one[len2-len1+i]-one[i-1]); else sum+=one[len2-len1+i]-one[i-1]; } printf("%I64d\n",sum); return 0; }