zoukankan      html  css  js  c++  java
  • Codeforces Round #336 (Div. 2) B. Hamming Distance Sum 计算答案贡献+前缀和

    B. Hamming Distance Sum
     

    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.

     题意:给你两个串 a,b;

            对于  "0011" , "0110"   价值就是  |0 - 0| + |0 - 1| + |1 - 1| + |1 - 0| = 0 + 1 + 0 + 1 = 2.

        a的长度严格小于等于b,a从b其实对应位置开始从右移到a,b末尾位置对应,问你在这一个过程中 价值是多少

    题解:我们就  计算对于b串每一个元素  所取得的价值是多少就好了,算个前缀就好

    //meek///#include<bits/stdc++.h>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include<iostream>
    #include<bitset>
    using namespace std ;
    #define mem(a) memset(a,0,sizeof(a))
    #define pb push_back
    #define fi first
    #define se second
    #define MP make_pair
    typedef long long ll;
    
    const int N = 201000;
    const int inf = 0x3f3f3f3f;
    const int MOD = 100003;
    const double eps = 0.000001;
    
    char a[N],b[N];
    int sum[N],hou[N];
    int main()
     {
         scanf("%s%s",a,b);
         int lena=strlen(a);
         for(int i=0;i<lena;i++) {
             sum[i+1] = sum[i]+a[i]-'0';
         }
         ll ans=0;
         int len=strlen(b);
         for(int i=0;i<len;i++) {
            b[i]-='0';
         }
         for(int i=0;i<len;i++) {
              int l,r;
            if(i+1>=lena) r=lena;
            else r=i+1;
            if(i+1>=lena) {
                 if(i+lena<=len) l=1;
            else l=(i+1)-(len-lena);
            }
            else {
                if(len-lena>=i+1) l=1;
                else {
                    l=i+1-(len-lena);
                }
            }
    
            if(b[i]==1) {
                ans += (r-l+1)-(sum[r]-sum[l-1]);
            }
            else ans+= (sum[r]-sum[l-1]);
         }
         cout<<ans<<endl;
     return 0;
    }
    代码
  • 相关阅读:
    CentOS查看CPU信息、位数、多核信息
    Linux常用命令大全
    chmod命令详细用法
    tar命令的详细解释
    yum和rpm命令详解
    LeetCode 241. Different Ways to Add Parentheses
    LeetCode 139. Word Break
    LeetCode 201. Bitwise AND of Numbers Range
    LeetCode 486. Predict the Winner
    LeetCode 17. Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/zxhl/p/5072693.html
Copyright © 2011-2022 走看看