zoukankan      html  css  js  c++  java
  • 2017ecjtu-summer training #2 CodeForces 608B

    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|.

    Examples
    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.

    题意: 定义两个字符串之间的距离是所有对应的每个字符相减绝对值的和, 给定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
    ",ans);
    35     }
    36     return 0;
    37 }

     

  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/stranger-/p/7127969.html
Copyright © 2011-2022 走看看