2017ecjtu-summer training #2 CodeForces 608B
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|.
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.
Print a single integer — the sum of Hamming distances between a and all contiguous substrings of b of length |a|.
01
00111
3
0011
0110
2
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 is1 + 0 + 1 + 1 = 3.
The second sample case is described in the statement.
题意: 定义两个字符串之间的距离是所有对应的每个字符相减绝对值的和, 给定a和b两个字符串, 求b中与a长度相同的所有子串与a字符串距离之和.
分析: 多写一些样例,就可以归纳出来, 其实就是a字符串中的第一个元素,分别 与b字符串中的第一个元素至第|b|-|a|+1个元素求距离的和, 再加上a字符串中的第2个元素,分别 与b字符串中的第2个元素至第|b|-|a|+2个元素求距离的和......直到a字符串中的第|a|个元素与b字符串中的第|a|个元素至第|b|个元素求距离的总和. 由于求距离很像求异或和, 因此可以先用两个数组分别保存b字符串的0个数的前缀和和1个数的前缀和, 遍历a字符串的时候 ,如果字符是1 ,那么求相应区间0的的个数, 如果字符是0 ,那么求相应区间1的的个数.
AC代码
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 #define maxn 222222 6 typedef long long ll; 7 char a[maxn],b[maxn]; 8 int res1[maxn],res0[maxn]; 9 int main() 10 { 11 while(~scanf("%s%s",a+1,b+1)) 12 { 13 int la=strlen(a+1),lb=strlen(b+1); 14 res1[0]=res0[0]=0; 15 for(int i=1; i<=lb; i++) 16 { 17 if(b[i]=='1') 18 { 19 res1[i]=res1[i-1]+1; 20 res0[i]=res0[i-1]; 21 } 22 else 23 { 24 res1[i]=res1[i-1]; 25 res0[i]=res0[i-1]+1; 26 } 27 } 28 ll ans=0; 29 for(int i=1; i<=la; i++) 30 if(a[i]=='1') 31 ans+=res0[lb-(la-i)]-res0[i-1]; 32 else 33 ans+=res1[lb-(la-i)]-res1[i-1]; 34 printf("%I64d\n",ans); 35 } 36 return 0; 37 }