SCAU 10678 神奇的异或
10678 神奇的异或
时间限制:1000MS 内存限制:65535K
题型: 编程题 语言: 无限制
Description
在现在这个信息时代,数据是很重要的东西哦~
很多时候,一条关键的数据(情报、信息)是可以价值千金的。
所以,现代也出现了很多数据校验技术来确保数据的正确性。 以下是一种校验算法:
K字节称为一个校验段,校验段的的K个字节的异或结果等于0时,校验段合法。
输入格式
有若干组输入。以EOF为结束。
每组输入第一行是数据长度n,和查询次数qn,以空格隔开。
接下来一行工n*2个字符,是十六进制(大写)表示的n个字节的数据。
然后有qn行输入,每行对应一个查询。
每行查询有pos和k,表示查询从pos位置开始的k个字节的数据能否通过校验。
2<=n<=50000,1<=qn<=20000, 1<=k<=n, 0<=pos<=n-k
输出格式
对于每组数据,输出一行,输出通过检验的次数。
输入样例
10 6
F132274D3CFB0A95009F
1 7
2 7
1 8
1 8
0 9
0 7
输出样例
3
来源
by 200930740513
作者
admin
解题思路
之所以神奇,是因为这题要用到异或再异或之后回到本身这个神奇的性质,题目每一个qn基本都是检验随机一段的合法性,数据量大如果一个一个去异或肯定会超时,采取的办法是记录每一个字节所在位置存储此字节跟前面所有字节异或后的结果(其实只要异或前面字节位置存储的结果),这点在输入字节的时候就需要进行计算。有n个字节就用数组存储n个异或结果,最后一个位置存储的就是全部字节异或的结果。现在如果要求pos位置后面k个字节异或的结果进行检测,那么根据之前存储的总的异或后得结果,用存储的数组下标【k+pos-1】跟【pos-1】下标再一次进行异或就能得到结果,从而判断是否为零
#include<iostream>
#include<cstring>
#include<cstdio>
#define SIZE 16
#define MAXN 50000*2+10
using namespace std; int hexor[SIZE][SIZE];
int store[MAXN];
int n, qn; void init()
{
for(int i=; i<SIZE; ++i)
for(int j=i; j<SIZE; ++j)
hexor[i][j] = hexor[j][i]= i^j;
} int main()
{
char first, second;
int str, stp;
init();
while(scanf("%d%d", &n, &qn) != EOF)
{
getchar();
for(int i=; i<n; ++i)
{
scanf("%c%c", &first, &second);
str = first >= '' && first <= '' ? (first - '') : (first - 'A' + );
stp = second >= '' && second <= '' ? (second - '') : (second - 'A' + );
if(!i) store[i] = str*+stp;
else store[i] = hexor[store[i-]/][str]* + hexor[store[i-]%][stp];
}
int sum = , pos, k, temp;
for(int t=; t<=qn; ++t)
{
scanf("%d%d", &pos, &k);
if(!pos && !store[k+pos-]) sum++;
//这里不能这样写: store[k+pos-1]^store[pos-1] == 0
else if((temp = store[k+pos-]^store[pos-]) == ) sum++;
}
printf("%d\n", sum);
}
return ;
}
SCAU 10678 神奇的异或的更多相关文章
- codeforces 1438D,思路非常非常巧妙的构造题
大家好,欢迎来到codeforces专题. 今天选择的问题是contest1438的D题,全场通过人数为1325人.一般在codeforces当中千人通过的题难度都不算太高,但是这题有点例外,虽然没有 ...
- SCAU 还有两个东西 —— 异或
竞赛题 F 还有两个东西 Time Limit:400MS Memory Limit:65535K 题型: 编程题 语言: 无限制 描述 给出n( n >= 2 )个整数,其中有 2 个 ...
- 一行神奇的javascript代码
写本篇文章的缘由是之前群里@墨尘发了一段js代码,如下: (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~ ...
- 对《神奇的C语言》文中例子 5 代码的分析讨论
在春节前,我曾经参与在<神奇的C语言>一文中的例子(5)的讨论,但限于评论内容的有限,现在本文再次对这个问题单独讨论.(此问题原貌,详见<神奇的C语言>,这里我将原文中的代码稍 ...
- 《Xenogears》(异度装甲)隐含的原型与密码
<Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...
- 【转】C语言位运算符:与、或、异或、取反、左移与右移详细介绍
转载自:http://www.jb51.net/article/40559.htm,感谢原作者. 以下是对C语言中的位运算符:与.或.异或.取反.左移与右移进行了详细的分析介绍,需要的朋友可以过来参考 ...
- 转:C的|、||、&、&&、异或、~、!运算
转自:C的|.||.&.&&.异或.~.!运算 位运算 位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位 ...
- C语言位运算符:与、或、异或、取反,左移和右移
C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...
- C的|、||、&、&&、异或、~、!运算(转)
位运算 位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有: &(按位与).|(按位或) ...
随机推荐
- make clean-kernel && make kernel
当在kernel下使用全编译指令后,回到主目录编译仍然有错,那么需要:在 kernel/include/config:删去该文件夹 make clean-kernel && make ...
- POJ -3190 Stall Reservations (贪心+优先队列)
http://poj.org/problem?id=3190 有n头挑剔的奶牛,只会在一个精确时间挤奶,而一头奶牛需要占用一个畜栏,并且不会和其他奶牛分享,每头奶牛都会有一个开始时间和结束时间,问至少 ...
- < %=...%>< %#... %>< % %>< %@ %>具体意义
< %=...%>< %#... %>< % %>< %@ %>< %#... %>: 是在绑定控件DataBind()方法执行时被执行,用 ...
- MS UI Automation Introduction
MS UI Automation Introduction 2014-09-17 MS UI Automation是什么 UIA架构 UI自动化模型 UI自动化树概述 UI自动化控件模式概述 UI 自 ...
- 用Access作为后台数据库支撑,书写一个C#写入记录的案例
要想操作一个数据库,不论是那种操作,首先要做的肯定是打开数据库. 下面我们以ACCESS数据库来做例子说明如何打开一个数据库连接! 在这里我们需要用到的是: System.Data.OleDb.O ...
- springMVC实现多文件上传
<h2>上传多个文件 实例</h2> <form action="/workreport/uploadMultiFile.html" method=& ...
- CodeForces Round #298 Div.2
A. Exam 果然,并没有3分钟秒掉水题的能力,=_=|| n <= 4的时候特判.n >= 5的时候将奇数和偶数分开输出即可保证相邻的两数不处在相邻的位置. #include < ...
- 【英语】Bingo口语笔记(64) - Beat系列
- phonegap 单例模式
今天在使用云推送的时候 app打开着,然后 控制台推送一条消息 结果点击后又重新打开了一个客户端... ok,我需要的是单例,我使用了singleInstance ,达到了效果. 引用百度知道的 ...
- IOS 单例 创建方式
@implementation Me static Car *sharedInstance= nil;//声明一个静态对象引用并赋为nil +(Me *) sharedInstance//声明类方法( ...