Description
Genos needs your help. He was asked to solve the following programming problem by Saitama:
The length of some string s is denoted |s|. The Hamming distance between two strings s and t of equal length is defined as , where si is the i-th character of s and ti is the i-th character of t. For example, the Hamming distance between string "0011" and string "0110" is |0 - 0| + |0 - 1| + |1 - 1| + |1 - 0| = 0 + 1 + 0 + 1 = 2.
Given two binary strings a and b, find the sum of the Hamming distances between a and all contiguous substrings of b of length |a|.
Input
The first line of the input contains binary string a (1 ≤ |a| ≤ 200 000).
The second line of the input contains binary string b (|a| ≤ |b| ≤ 200 000).
Both strings are guaranteed to consist of characters '0' and '1' only.
Output
Print a single integer — the sum of Hamming distances between a and all contiguous substrings of b of length |a|.
Sample Input
01 00111
3
0011 0110
2
Hint
For the first sample case, there are four contiguous substrings of b of length |a|: "00", "01", "11", and "11". The distance between "01" and "00" is |0 - 0| + |1 - 0| = 1. The distance between "01" and "01" is |0 - 0| + |1 - 1| = 0. The distance between "01" and "11" is|0 - 1| + |1 - 1| = 1. Last distance counts twice, as there are two occurrences of string "11". The sum of these edit distances is 1 + 0 + 1 + 1 = 3.
The second sample case is described in the statement.
应该算是前缀数组吧,没想到,模拟了一下;
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int i,j,k,l,m,n;
int main()
{
char s[220000];
while(scanf("%s",s)!=EOF)
{
char c[220000];
l=strlen(s);
scanf("%s",c);
int len=strlen(c);
int help=len-l+1;
int cnt=0;
__int64 ans=0;//第九组测试数据特别大,超出了int,请用long long
int flag=0;
int nn=0;
int mm=0;
for(j=0;j<help;j++)
{
if(c[j]=='1')
nn++;//1
else
mm++;//0
}
if(s[0]=='1')
ans+=mm;
else
ans+=nn;
for(i=1;i<l;i++)
{
if(c[i-1]=='1')
nn--;
else
mm--;
if(c[i+help-1]=='1')
nn++;
else
mm++;
if(s[i]=='1')
ans+=mm;
else
ans+=nn;
}
printf("%I64d\n",ans);
}
}
再附一个自己写的前缀数组:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char s[1100000],c[1100000];
int dp[2][1100000],i,j,k,l,m,n,p;
int main()
{
while(scanf("%s%s",s+1,c+1)!=EOF)
{
l=strlen(s+1);
int len=strlen(c+1);
memset(dp,0,sizeof(dp));
for(i=1;i<=len;i++)
{
dp[1][i]+=dp[1][i-1]+(c[i]=='1');
dp[0][i]+=dp[0][i-1]+(c[i]=='0');
}
__int64 ans=0;
for(i=1;i<=l;i++)
{
int help=len-l+i;
if(s[i]=='1')
ans+=dp[0][help]-dp[0][i-1];
else
ans+=dp[1][help]-dp[1][i-1];
}
printf("%I64d\n",ans);
}
}