CodeForces 608B Hamming Distance Sum

来源:互联网 发布:911segg.info新域名 编辑:程序博客网 时间:2024/06/05 02:18
B - Hamming Distance Sum
Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u
Submit Status Practice CodeForces 608B

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

Input
0100111
Output
3
Input
00110110
Output
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.


FAQ | About Virtual Judge | Forum | Discuss | Open Source Project

题意: 定义两个字符串之间的距离是所有对应的每个字符相减绝对值的和, 给定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的的个数.


代码:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<cctype>#define max(a,b)(a>b?a:b)#define min(a,b)(a<b?a:b)#define INF 0x3f3f3f3ftypedef long long ll;using namespace std;#define N 200100char a[N],b[N];ll sum0[N],sum1[N];int main(){    int len1,len2,i;    gets(a+1);    gets(b+1);    len1=strlen(a+1);    len2=strlen(b+1);    memset(sum0,0,sizeof(sum0));    memset(sum1,0,sizeof(sum1));    for(i=1; i<=len2; i++)    {        if(b[i]=='0')        {            sum0[i]=sum0[i-1]+1;            sum1[i]=sum1[i-1];        }        else        {            sum1[i]=sum1[i-1]+1;            sum0[i]=sum0[i-1];        }    }    ll ans=0;  ///  注意此处要用long long 否则超int~~~    for(i=1; i<=len1; i++)    {        if(a[i]=='1')        {            ans=ans+(sum0[len2-len1+i]-sum0[i-1]);        }        else        {            ans=ans+(sum1[len2-len1+i]-sum1[i-1]);        }    }    printf("%lld\n",ans);    return 0;}


0 0
原创粉丝点击