湖南省第十一届大学生程序设计竞赛:Internet of Lights and Switches(HASH+二分+异或前缀和)
Internet of Lights and Switches
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 3 Solved: 3
[Submit][Status][Web Board]
Description
You are a fan of "Internet of Things"(IoT, 物联网), so you build a nice Internet of Lights and Switches in your huge mansion. Formally, there are n lights and m switches,
each switch controls one or more lights, i.e. pressing that switch
flips the status of those lights (on->off, off->on). Initially, all the lights are on. Your task is to count the number of ways to turn off all the lights by pressing some consecutive switches.
Each switch should not be pressed more than once. There is only one
restriction: the number of switches you pressed should be between a and b
(inclusive).
Input
There
will be at most 20 test cases. Each test case begins with a line
containing four integers n, m, a, b(2<=n<=50,
1<=a<=b<=m<=300000). Each of the following m lines contains a
01 string of length n.The i-th character is 1 if and only if that
switch controls the i-th light. The size of the whole input file
does not exceed 8MB.
Output
For each test case, print the case number, and the number of ways to turn off all the lights.
Sample Input
2 4 1 4
01
10
11
00
2 4 3 3
01
10
11
00
6 3 1 3
101001
010110
101001
Sample Output
Case 1: 3
Case 2: 0
Case 3: 2 题意:现在有m盏灯,有n个开关(m<=50,n<=300000) 现在开关用01串表示,为1表示开关可以操作当前的灯,现在必须操纵连续k盏灯使得这些这些灯全部关闭,A<=k<=B,问现在有多少这样连续的开关满足条件?
题解:去年省赛竟然有几支队A了,ORZ,映射好难想到啊~.这题的话我们保存一个异或前缀和,如果某段的异或和为全1,那么这段就是可取的.但是怎么找到呢?我们假设xorsum[1,i]^xorsum[1,j] 为全1.那么xor[j+1,i]是符合条件的,关键是怎么找到这个区间?这时候就要用到hash了,用map映射满足当前异或前缀和的所有下标。用一个vector记录,然后输入的时候,只要查询 i 前面有多少个下标的异或值为 1111111...^xor[1,x], 然后可以二分查询当前的下标距离 i 必须为 A~B 之间,在这个范围内满足的下标的个数就是当前与 i 组合成为区间满足条件的个数,还有一种情况就是[1,i]这个区间满足条件,这种情况直接++即可.
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
typedef long long LL;
char str[];
const int INF = ;
map<LL,vector<int> > mp;
int n,m,A,B;
LL charToLL(char *str){
LL ans = ;
int p = ,len = strlen(str);
for(int i=len-;i>=;i--){
if(str[i]==''){
ans+=p;
}
p*=;
}
return ans;
}
int binary(LL val,int id){
vector <int> vec = mp[val];
int down = ,up = vec.size()-,r=-,l=INF;
while(down<=up){
int mid = (down+up)>>;
if(id-vec[mid]>=A){
r = mid;
down = mid+;
}else up = mid-;
}
down = ,up = vec.size()-;
while(down<=up){
int mid = (down+up)>>;
if(id-vec[mid]<=B){
l = mid;
up = mid-;
}else down = mid+;
}
//printf("%d %d\n",l,r);
if(l>r) return ;
return r-l+;
}
int main(){
int t = ;
while(scanf("%d%d%d%d",&m,&n,&A,&B)!=EOF){
mp.clear();
for(int i=;i<m;i++){
str[i] = '';
}
str[m]='\0';
LL k = charToLL(str),xorsum=,ans = ;
for(int i=;i<=n;i++){
scanf("%s",str);
LL x = charToLL(str);
xorsum^=x;
if(xorsum==k&&i>=A&&i<=B) ans++;
ans+=binary(k^xorsum,i);
mp[xorsum].push_back(i);
}
printf("Case %d: %lld\n",t++,ans);
}
}
湖南省第十一届大学生程序设计竞赛:Internet of Lights and Switches(HASH+二分+异或前缀和)的更多相关文章
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛
传送门:2018 ACM 国际大学生程序设计竞赛上海大都会赛 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛2018-08-05 12:00:00 至 2018-08-05 17:00:0 ...
- 河南省第十一届ACM大学生程序设计竞赛
nyoj-1365-山区修路 内存限制:128MB 时间限制:3000ms 特判: No通过数:4 提交数:4 难度:3 题目描述: SNJ位于HB省西部一片群峰耸立的高大山地,横亘于A江.B水之间, ...
- 2016中国大学生程序设计竞赛 - 网络选拔赛 C. Magic boy Bi Luo with his excited tree
Magic boy Bi Luo with his excited tree Problem Description Bi Luo is a magic boy, he also has a migi ...
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1001 HDU 5961
传递 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1008 HDU 5968
异或密码 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)
Alice and Bob Time Limit: 1000ms Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1009 HDU 5969
最大的位或 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server
点击打开链接 2226: Contest Print Server Time Limit: 1 Sec Memory Limit: 128 MB Submit: 53 Solved: 18 [Su ...
- 山东省第四届ACM大学生程序设计竞赛解题报告(部分)
2013年"浪潮杯"山东省第四届ACM大学生程序设计竞赛排名:http://acm.upc.edu.cn/ranklist/ 一.第J题坑爹大水题,模拟一下就行了 J:Contes ...
随机推荐
- Redis的Sorted Set有序集合命令
Sorted Set是Set的一个升级版本,它在Set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序.可以理解为有两列的mysql表, ...
- phonegap(cordova)从手机app跳转到web页面在跳转回APP本地页面思路
项目中需要用到 WAP支付宝支付. 但是 使用PHONEGAP开发 跳转到支付宝支付,然后跳转回来 就回不到APP的本地页面, 就是使用WAP的第三方登录也是一样的.很难从WAP页面在跳转到 app本 ...
- Linux iptables:场景实战一
<Linux iptables:规则原理和基础>和<Linux iptables:规则组成>介绍了iptables的基础及iptables规则的组成,本篇通过实际操作进行ipt ...
- cp 带着属性复制过去,
sudo cp -ra store_bak/* store/ -r 所有文件循环都复制 -a 带着属性复制过去
- mysql 在linux服务器恢复数据表方法记录
在本地搭建测试环境录入的数据放到线上测试,备份了数据表为一个.sql文件, 在服务器上登录mysql执行 source (如:source exposition_exposition.sql) 文件路 ...
- 编写可移植C/C++程序的要点
1.分层设计,隔离平台相关的代码.就像可测试性一样,可移植性也要从设计抓起.一般来说,最上层和最下层都不具有良好的可移植性.最上层是GUI,大多数GUI都不是跨平台的,如Win32 SDK和MFC.最 ...
- 几何+思维 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest K. Revenge of the Dragon
题目链接:http://codeforces.com/gym/101149/problem/K 题目大意: 给你两个点a,b.一个人在a点,一个人在b点,b点的人要追杀a的点,他的跑步速度是a的两倍. ...
- POJ 1389 Area of Simple Polygons 扫描线+线段树面积并
---恢复内容开始--- LINK 题意:同POJ1151 思路: /** @Date : 2017-07-19 13:24:45 * @FileName: POJ 1389 线段树+扫描线+面积并 ...
- HDP安全之集成kerberos/LDAP、ranger(knox自带LDAP)
----------------------目录导航见左上角------------------------------- 环境 HDP 3.0.1.0 (已有) JDK 1.8.0_91 (已有 ...
- Flex布局之box-flex
box-flex的写法比flex的写法要复杂一些,兼容性的前缀要多带几个,真希望有一天flex布局能够纳入w3c标准啊! <!DOCTYPE html> <html> < ...