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;
    }
    代码
  • 相关阅读:
    SGU 271 Book Pile (双端队列)
    POJ 3110 Jenny's First Exam (贪心)
    HDU 4310 Hero (贪心)
    ZOJ 2132 The Most Frequent Number (贪心)
    POJ 3388 Japanese Puzzle (二分)
    UVaLive 4628 Jack's socks (贪心)
    POJ 2433 Landscaping (贪心)
    CodeForces 946D Timetable (DP)
    Android Studio教程从入门到精通
    Android Tips – 填坑手册
  • 原文地址:https://www.cnblogs.com/zxhl/p/5072693.html
Copyright © 2011-2022 走看看