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的更多相关文章

  1. 【CF472G】Design Tutorial 压位

    题目大意 给出两个\(01\)序列\(A\)和\(B\) 汉明距离定义为两个长度相同的序列中,有多少个对应位置上的数字不一样 \(00111\) 和 \(10101\)的距离为\(2\) \(Q\)次 ...

  2. cf 472G Design Tutorial: Increase the Constraints 分块+压位/FFT

    题目大意 给出两个\(01\)序列\(A\)和\(B\) 哈明距离定义为两个长度相同的序列中,有多少个对应位置上的数字不一样 "00111" 和 "10101" ...

  3. 【译】Design For Maturing Android-为日渐成熟的Android做设计

    为日渐成熟的Android做设计 [声明] 本篇博文英文版原文来自Smashing Magazine,本人经Smashing Magazine邮件授权后翻译,转载请注明出处.谢谢!原文地址. 我将不定 ...

  4. 【转】JMeter Tutorial的安装和具体操作

    1.下载Jmeter 下载地址:http://jmeter.apache.org/download_jmeter.cgi 目前最新版为2.9,其余文件如源代码等也可从如下官网下载: http://jm ...

  5. 【CodeForces 472A】Design Tutorial: Learn from Math

    题 题意:给你一个大于等于12的数,要你用两个合数表示出来.//合数指自然数中除了能被1和本身整除外,还能被其他的数整除(不包括0)的数. 分析:我们知道偶数除了2都是合数,给你一个偶数,你减去一个偶 ...

  6. 【异常】java.lang.LinkageError: loader constraints violated

    [问题背景]      南非客户帐单提醒功能过程中的一个问题,当启动服务器后,后台报java.lang.LinkageError: loader constraints violated when l ...

  7. 【原】Storm Tutorial

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  8. 【转载】C# Tutorial - Simple Threaded TCP Server

    http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server In this tutorial I'm going t ...

  9. 【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 ...

随机推荐

  1. arp与rarp

  2. dvwa学习笔记之xss

    反射型Low 直接输入<script>alert(/xss/)</script>就可以发现弹窗Medium 检查源码 可以看到网站对输入字符进行了过滤,尝试双写绕过,构造< ...

  3. 阿里云解析记录应对家里动态IP

    <?php #需要配置的项 define('ACCESSKEYID',''); #阿里云用户密钥ID 获取方法 https://help.aliyun.com/knowledge_detail/ ...

  4. tensorflow enqueue_many传入多个值的列表传入异常问题————Shape () must have rank at least 1

    tf 的队列操作enqueue_many传入的值是列表,但是放入[]列表抛异常 File "C:\Users\lihongjie\AppData\Local\Programs\Python\ ...

  5. JVM调优(2)

    堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作 ...

  6. 随手记录-linux-Linux目录结构

    转:别人的 装完Linux,首先需要弄清Linux 标准目录结构 / root —?启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home —?存储普通用户的个人文件 ft ...

  7. React Native iOS 离线包

    平时使用React Native 时候, js代码和图片资源运行在一个Debug Server上(需要cd 到RN目录,然后终端执行 npm start 命令开启本地服务 ).每次更新代码之后只需要使 ...

  8. 慢吞吞的pip切换源

    http://blog.csdn.net/gz_liuyun/article/details/52778198

  9. 如何知道一个App的包名呢

    包名(Package name)是Android系统中判断一个APP的唯一标识 记录我获取包名的几种方式 方法一:通过cmd命令,打开你要获取包名的APP 1.adb shell 2.dumpsys ...

  10. java List.get

    并不能 用如果List在i位置值不存在 并不能 List.get(i) !=null 判断 会抛异常 版权声明:本文为博主原创文章,未经博主允许不得转载.