【Codeforces Round 336 (Div 2) B】【水题 前缀和】Hamming Distance Sum 双字符串所有位置匹配下的差异数之和

原创 2015年12月25日 11:46:32
B. Hamming Distance Sum
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard 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
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 is1 + 0 + 1 + 1 = 3.

The second sample case is described in the statement.


#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}
const int N=2e5+10,M=0,Z=1e9+7,ms63=0x3f3f3f3f;
int casenum,casei;
char a[N],b[N];
int f[2][N];
int main()
{
	while(~scanf("%s%s",a+1,b+1))
	{
		int n=strlen(a+1);
		int m=strlen(b+1);
		for(int i=1;i<=m;++i)
		{
			f[0][i]=f[0][i-1]+(b[i]=='0');
			f[1][i]=f[1][i-1]+(b[i]=='1');
		}
		LL ans=0;
		for(int i=1;i<=n;++i)
		{
			int l=i;
			int r=m-(n-i);
			if(a[i]=='0')ans+=f[1][r]-f[1][l-1];
			else ans+=f[0][r]-f[0][l-1];
		}
		printf("%lld\n",ans);
	}
	return 0;
}
/*
【题意】
给你一个模板串a和匹配串b,|a|<=|b|<=2e5,两个串都是01串。
于是,a串之于b串的匹配位置,就有|b|-|a|+1种
我们想问,对于所有的匹配位置,会产生的匹配差异总和是多少。

所以匹配差异,是指——
比如模板串是0011,匹配0101,对于所有'0' match '1' 或者'1' match '0 ',
都产生了1的匹配差异。即这个样例产生了2的匹配差异。

【类型】
水题 前缀和

【分析】
我们直接枚举a串的每个位置,它会对应出b串的一个匹配区间。
我们只要查看区间中有多少字符与其不同即可。
这个可以利用前缀和简单实现。

【时间复杂度&&优化】
O(n+m)

*/

版权声明:题解中哪里写错请一定要指出来QwQ 转载还请注明下出处哦,谢谢^_^

Codeforces Round #406 (Div. 2):C. Berzerk(记忆化搜索解决博弈问题)

C. Berzerk time limit per test 4 seconds memory limit per test 256 megabytes input standard in...
  • Jaihk662
  • Jaihk662
  • 2017年03月24日 15:23
  • 781

codeforces 237/A 一道水题的感悟。。。。

http://codeforces.com/problemset/problem/237/A Valera runs a 24/7 fast food cafe. He magically ...
  • u013573047
  • u013573047
  • 2014年04月08日 17:57
  • 679

【Codeforces Round 375 (Div 2) E】【欧拉回路Fleury算法 或网络流】One-Way Reform 每条边定向使得最多的点满足入度=出度

E. One-Way Reform time limit per test 2 seconds memory limit per test 256 megabytes ...
  • snowy_smile
  • snowy_smile
  • 2016年10月04日 10:20
  • 733

zzuoj-10471: 数列游戏 I(差分数组+前缀和)

传送门先说说什么是差分数组,我在网上没找到有关差分数组的详细介绍,我就说说我对差分数组的理解 对于一个数组a[N],其差分数组d[i]=a[i]-a[i-1] (i>0)且d[0]=a[0](这是...
  • qq_21120027
  • qq_21120027
  • 2016年05月07日 16:31
  • 1218

字符串匹配的KMP算法--前缀和后缀的详解

字符串匹配的KMP算法 作者: 阮一峰 字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDAB...
  • MAOTIANWANG
  • MAOTIANWANG
  • 2014年06月25日 18:17
  • 5218

LibreOJ β Round #2 A. 模拟只会猜题意【前缀和】

A. 模拟只会猜题意 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 转到题库提交记录返回比赛 ...
  • mengxiang000000
  • mengxiang000000
  • 2017年07月03日 17:56
  • 453

Matlab图像处理学习笔记(三):基于匹配的目标识别

如果要在一幅图像中寻找已知物体,最常用且最简单的方法之一就是匹配。 在目标识别的方法中,匹配属于基于决策理论方法的识别。匹配方法可以是最小距离分类器,相关匹配。本文code是基于最小距离分类器,基于...
  • u010278305
  • u010278305
  • 2015年01月08日 23:13
  • 4912

【Codeforces Round 276 (Div 2)B】【水题】Valuable Resources 最小正方形包含所有点

B. Valuable Resources time limit per test 1 second memory limit per test 256 megabytes ...
  • snowy_smile
  • snowy_smile
  • 2015年12月08日 16:31
  • 416

【Codeforces Round 363 (Div 2) B】【水题 行列计数】One Bomb 炸弹人爆破游戏

B. One Bomb time limit per test 1 second memory limit per test 256 megabytes input ...
  • snowy_smile
  • snowy_smile
  • 2016年07月26日 09:07
  • 658

Codeforces Round #277 (Div. 2) A (水题)B(水题) C(贪心)

A. Calculating Function For a positive integer n let's define a function f: f(n) =  - 1 + 2 -...
  • u013534690
  • u013534690
  • 2014年11月12日 20:58
  • 723
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Codeforces Round 336 (Div 2) B】【水题 前缀和】Hamming Distance Sum 双字符串所有位置匹配下的差异数之和
举报原因:
原因补充:

(最多只允许输入30个字)