【CF472G】Design Tutorial: Increase the Constraints
Description
给出两个01序列\(A\)和\(B\)
要求回答\(q\)个询问每次询问\(A\)和\(B\)中两个长度为\(len\)的子串的哈明距离
哈明距离的值即有多少个位置不相等
\(1 \le |A|,|B| \le 2*10^5\)
\(1 \le q \le 4*10^5\)
保证输入合法,序列下标从0开始
Solution
大暴力分块,记录一下思想
题解做法比较繁琐
先求出每一个位置开始长度为32的序列状态,压进一个unsigned int
每\(T\)位分一块,处理出\(A\)中第\(i\)块整块构成的字符串和\(B\)中从\(j\)开始长度为\(T\)的子串的哈明距离\(f_{i,j}\)
询问时两边暴力计算,中间用\(f\)计算
时间复杂度\(O(\frac {nm}{32})\),常数非常不优秀
下面是常数小的做法
求出每一个位置开始长度为64的序列状态,压进一个unsigned long long
询问?直接扫!单次询问复杂度\(O(\frac {len}{64})\),实测常数非常优秀,大约1.5s出解
Code
#include <cstdio>
#include <cstring>
using namespace std;
typedef unsigned long long ull;
const int N=200005;
int len;
char str[N];
ull a[N],b[N];
int cnt[65536];
inline int sum(ull x){return cnt[x&65535]+cnt[(x>>16)&65535]+cnt[(x>>32)&65535]+cnt[(x>>48)&65535];}
int main(){
scanf("%s",str); len=strlen(str);
for(int i=len-1;i>=0;i--)
a[i]=(a[i+1]>>1)|((ull)(str[i]=='1')<<63);
scanf("%s",str); len=strlen(str);
for(int i=len-1;i>=0;i--)
b[i]=(b[i+1]>>1)|((ull)(str[i]=='1')<<63);
for(int i=0;i<65536;i++) cnt[i]=cnt[i>>1]+(i&1);
int q,x,y,z,ans,up;
scanf("%d",&q);
while(q--){
scanf("%d%d%d",&x,&y,&z);
ans=0;
for(;z>=64;x+=64,y+=64,z-=64)
ans+=sum(a[x]^b[y]);
if(z)
ans+=sum((a[x]^b[y])&((ull)(-1)-(((ull)1<<(64-z))-1)));
printf("%d\n",ans);
}
return 0;
}
【CF472G】Design Tutorial: Increase the Constraints的更多相关文章
- 【CF472G】Design Tutorial 压位
题目大意 给出两个\(01\)序列\(A\)和\(B\) 汉明距离定义为两个长度相同的序列中,有多少个对应位置上的数字不一样 \(00111\) 和 \(10101\)的距离为\(2\) \(Q\)次 ...
- cf 472G Design Tutorial: Increase the Constraints 分块+压位/FFT
题目大意 给出两个\(01\)序列\(A\)和\(B\) 哈明距离定义为两个长度相同的序列中,有多少个对应位置上的数字不一样 "00111" 和 "10101" ...
- 【译】Design For Maturing Android-为日渐成熟的Android做设计
为日渐成熟的Android做设计 [声明] 本篇博文英文版原文来自Smashing Magazine,本人经Smashing Magazine邮件授权后翻译,转载请注明出处.谢谢!原文地址. 我将不定 ...
- 【转】JMeter Tutorial的安装和具体操作
1.下载Jmeter 下载地址:http://jmeter.apache.org/download_jmeter.cgi 目前最新版为2.9,其余文件如源代码等也可从如下官网下载: http://jm ...
- 【CodeForces 472A】Design Tutorial: Learn from Math
题 题意:给你一个大于等于12的数,要你用两个合数表示出来.//合数指自然数中除了能被1和本身整除外,还能被其他的数整除(不包括0)的数. 分析:我们知道偶数除了2都是合数,给你一个偶数,你减去一个偶 ...
- 【异常】java.lang.LinkageError: loader constraints violated
[问题背景] 南非客户帐单提醒功能过程中的一个问题,当启动服务器后,后台报java.lang.LinkageError: loader constraints violated when l ...
- 【原】Storm Tutorial
Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...
- 【转载】C# Tutorial - Simple Threaded TCP Server
http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server In this tutorial I'm going t ...
- 【Leetcode】807. Max Increase to Keep City Skyline
Description In a 2 dimensional array grid, each value grid[i][j] represents the height of a building ...
随机推荐
- VS Code配置初探
之前一直在用 Webstorm,看现在 VS Code 热度那么高,想着尝试一下. 熟悉编辑器的快捷键 VS Code 快捷键一览 安装使用到的插件 Chinese(修改你的编辑器语言,默认英文) E ...
- egret性能优化总结
## 来自官方的优化建议 详见:http://edn.egret.com/cn/article/index/id/287 (1) 少使用Alpha混合. (2) 显式停止计时器,让它们准备好进行垃圾回 ...
- Streamr助你掌控自己的数据(3)——教你在Streamr市场上发布数据
博客说明 所有刊发内容均可转载但是需要注明出处. 教你在Streamr市场上发布数据 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...
- Sentence | Never underestimate yourself.
"\(Our\) \(deepest\) \(fear\) \(is\) \(not\) \(that\) \(we\) \(are\) $inadequate. $ \(Our\) \(d ...
- Vue.js 相关知识(组件)
1. 组件介绍 组件(component),vue.js最强大的功能之一 作用:封装可重用的代码,通常一个组件就是一个功能体,便于在多个地方都能调用该功能体 根组件:我们实例化的Vue对象就是一个组件 ...
- Acer 4750G安装OS X 10.9 DP4(简版)
一.下载os x 10.9懒人版:http://bbs.pcbeta.com/viewthread-1384504-1-1.html 二.用系统自带的磁盘分区工具划分一个5G左右的临时安装盘(新建分区 ...
- Erlang的调度原理(译文)
原文 http://jlouisramblings.blogspot.com/2013/01/how-erlang-does-scheduling.html 免爬墙链接 http://www.diku ...
- Django之Form
目录 一.说明 二.参数说明 三.自定义验证规则 四.实例 一.说明 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数 ...
- so easy, too happy
一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 • Estimate • 估计这个任务需要多 ...
- Servlet 3.0对上传的支持
Servlet 2.5 进行上传 首先对表单的要求 ->method ="post" ->enctype="multipart/form-d ...