博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #336 Hamming Distance Sum
阅读量:5298 次
发布时间:2019-06-14

本文共 1128 字,大约阅读时间需要 3 分钟。

题目:

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
2 #include
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 else21 ans += f[r][0]-f[l][0];22 }23 printf("%lld\n",ans);24 return 0;25 }

 

转载于:https://www.cnblogs.com/zqy123/p/5073272.html

你可能感兴趣的文章
20169212《Linux内核原理与分析》 第十周作业
查看>>
xml
查看>>
【codeforces 760D】Travel Card
查看>>
HDU 3790 最短路径问题
查看>>
Python实现简单登陆验证(文件操作)
查看>>
自动化构建工具
查看>>
Jan 15 - Next Permutation; Array; Pointer;
查看>>
分布式网上商城项目-项目查询功能错误
查看>>
如何使用帮助文档
查看>>
Form表单与ajax提交文件方式
查看>>
ubuntu中安装mongo
查看>>
USACO 1.1.1 Your Ride Is Here
查看>>
STL_Vector
查看>>
HBase之Table.put客户端流程
查看>>
二叉树模板(调试中)
查看>>
编程中常用的几个特殊值
查看>>
UEditor 在 Layer 模态框中无法使用问题
查看>>
【vue】如何引用外部cdn资源
查看>>
BBS-评论功能
查看>>
这又是一个测试
查看>>