zoukankan      html  css  js  c++  java
  • Codeforces Round #336 Hamming Distance Sum

    题目:

    http://codeforces.com/contest/608/problem/B

    字符串a和字符串b进行比较,以题目中的第一个样例为例,我刚开始的想法是拿01与00、01、11、11从左到右挨个比较,希望能找到一些规律,结果并没有。。。

    其实,如果我们能从整个比较过程来看这个问题,整个过程就没有那么难。题目要求的东西,其实就是a字符串和b字符串子串每次比较的不同的个数的总和,当我们像上面那个思路,拿a字符串每次移动一位,和b进行比较的时候,从整个过程来看,就相当于a的每一个元素从前往后和b比较不同的个数,再把每个元素的不同个数相加。

    a中元素与b中比较并不是完全从前往后比,而是,对于a中第i个元素来说,他在b中也是从i个位置开始比较。比较区间的右端是len_b-len_a+i,这是因为,a与b最后一个子串的比较,一定是从len_b-len_a这个位置开始到最后,加上i就是比较到最后一个子串中i的位置。

    另外,这道题用到了前缀和的技巧,就可以用O(a+b)的复杂度解决。

     1 #include<stdio.h>
     2 #include<string.h> 
     3 #define maxn 200005
     4 char a[maxn],b[maxn] ;
     5 int f[maxn][2];
     6 int main(){
     7     scanf(" %s %s",a+1,b+1);
     8     int lena = strlen(a+1);
     9     int lenb = strlen(b+1);
    10     for(int i = 1;i<=lenb;i++){
    11         f[i][0] = f[i-1][0];
    12         f[i][1] = f[i-1][1];
    13         f[i][b[i]-'0']++;
    14     }
    15     long long ans = 0;
    16     for(int i = 1;i<=lena;i++){
    17         int l = i-1,r = lenb-lena+i;
    18         if(a[i]=='0')
    19             ans += f[r][1]-f[l][1];
    20         else
    21             ans += f[r][0]-f[l][0];
    22     }
    23     printf("%lld
    ",ans);
    24     return 0;
    25 }
  • 相关阅读:
    SQL查询
    redis 命令行常用命令
    linux ss ip
    jdk下载地址
    requests.session保持会话
    Python通过重写sys.stdout将控制台日志重定向到文件
    解决Python3 控制台输出InsecureRequestWarning问题
    uniapp实现iframe效果
    模拟登录 react 的页面
    vueX的五大属性和使用方法包括辅助函数
  • 原文地址:https://www.cnblogs.com/zqy123/p/5073272.html
Copyright © 2011-2022 走看看