Codeforces Round #336 (Div. 2) B. Hamming Distance Sum

RikkaTheWorld 2015-12-26 06:55:58
B. Hamming Distance Sum
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
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 test(s)
input
01
00111
output
3
input
0011
[i]0110
output
2
Note
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.

题意 :
输入 两个字符串a和b ,让a字符串往b里正序匹配所有与a一样长的字符然后每个字符相减求绝对值,最后绝对值求和。

用了循环嵌套写的我TLE成汪。
同学CW的模板,感觉挺有技巧。
只有两种情况0和1,先用两个数组存放b字符串0和1出现的次数和位置。
遍历a字符串所有字符数,让这个数字去减去b中a长度字符串(假设为s)里的每个字符数然后求和。
如果这个数字是1 那么当减去1时为0 而减去0时为1
所以可以用存放0的数组 用s最后一个位置出现0的次数减去s前一个位置出现0的次数即为a里这个数所遍历的结果。
0的情况反之亦然。
然后所有数相加。

代码:
#include<cstdio>
#include<vector>
#include<stack>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;

int a[200001],b[200001],c[200001];
int m,n;
char g;

int main()
{
n=m=0;
__int64 count=0;
a[0]=b[0]=c[0]=0;
while((g=getchar())!='\n')
{
n++;
a[n]=(int)g-48;
}

while((g=getchar())!='\n')
{
m++;
b[m]=b[m-1];
c[m]=c[m-1];
if(g=='1')
b[m]++;
else c[m]++;
}

for(int i=1;i<=n;i++ )
{
if(a[i]==0)
count+=b[m-n+i]-b[i-1];
else
count+=c[m-n+i]-c[i-1];
}
printf("%I64d",count);
return 0;
}
...全文
147 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧