【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 ...
随机推荐
- Unity优化方向——优化Unity游戏中的垃圾回收(译)
介绍 当我们的游戏运行时,它使用内存来存储数据.当不再需要该数据时,存储该数据的内存将被释放,以便可以重用.垃圾是用来存储数据但不再使用的内存的术语.垃圾回收是该内存再次可用以进行重用的进程的名称. ...
- nginx 定义的一些状态码
ngx_string(ngx_http_error_494_page), /* 494, request header too large */ ngx_string(ngx_http_erro ...
- 通过spark-submit提交hadoop配置的方法
通过spark提交的spark开头的配置在程序启动后会添加到SparkConf中,但是hadoop相关的配置非spark开头会被过滤掉,但是只要在这些配置的key前面添加spark.hadoop.前缀 ...
- python—多任务版udp聊天机器人
将多任务(多线程)引入到udp聊天机器人,可以实现同时发送消息和接收消息 import socket import threading def udp_send(udp_socket,ip,port) ...
- Vue实现双向绑定的原理以及响应式数据
一.vue中的响应式属性 Vue中的数据实现响应式绑定 1.对象实现响应式: 是在初始化的时候利用definePrototype的定义set和get过滤器,在进行组件模板编译时实现water的监听搜集 ...
- oracle数据update后怎么恢复到以前的数据
http://blog.csdn.net/itdada/article/details/52746392
- UVALive 6467 Strahler Order(拓扑序列)
In geology, a river system can be represented as a directed graph. Each river segment is an edge; wi ...
- Python脚本文件(.py)打包为可执行文件(.exe)即避免命令行中包含Python解释器
在最近的软件工程作业中用到了将Python脚本转化为exe文件这一过程,网上各种博客介绍了很多,有些东西都不完全,我也是综合了很多种方法最后才实现的,我就把这些整理出来,希望可以帮到大家~ 一.环 ...
- AloneQIan---第一次作业
小学生的噩梦 一.估计与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 600 720 • Estim ...
- 软工实践-Beta 冲刺 (2/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...