cf#336-B-Hamming Distance Sum

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;
	
}


你可能感兴趣的:(cf#336-B-Hamming Distance Sum)