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 神奇的异或的更多相关文章

  1. codeforces 1438D,思路非常非常巧妙的构造题

    大家好,欢迎来到codeforces专题. 今天选择的问题是contest1438的D题,全场通过人数为1325人.一般在codeforces当中千人通过的题难度都不算太高,但是这题有点例外,虽然没有 ...

  2. SCAU 还有两个东西 —— 异或

    竞赛题 F  还有两个东西 Time Limit:400MS  Memory Limit:65535K 题型: 编程题   语言: 无限制 描述 给出n( n >= 2 )个整数,其中有 2 个 ...

  3. 一行神奇的javascript代码

    写本篇文章的缘由是之前群里@墨尘发了一段js代码,如下: (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~ ...

  4. 对《神奇的C语言》文中例子 5 代码的分析讨论

    在春节前,我曾经参与在<神奇的C语言>一文中的例子(5)的讨论,但限于评论内容的有限,现在本文再次对这个问题单独讨论.(此问题原貌,详见<神奇的C语言>,这里我将原文中的代码稍 ...

  5. 《Xenogears》(异度装甲)隐含的原型与密码

    <Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...

  6. 【转】C语言位运算符:与、或、异或、取反、左移与右移详细介绍

    转载自:http://www.jb51.net/article/40559.htm,感谢原作者. 以下是对C语言中的位运算符:与.或.异或.取反.左移与右移进行了详细的分析介绍,需要的朋友可以过来参考 ...

  7. 转:C的|、||、&、&&、异或、~、!运算

    转自:C的|.||.&.&&.异或.~.!运算 位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位 ...

  8. C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  9. C的|、||、&、&&、异或、~、!运算(转)

    位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有:     &(按位与).|(按位或) ...

随机推荐

  1. POJ-3187 Backward Digit Sums (暴力枚举)

    http://poj.org/problem?id=3187 给定一个个数n和sum,让你求原始序列,如果有多个输出字典序最小的. 暴力枚举题,枚举生成的每一个全排列,符合即退出. dfs版: #in ...

  2. 2-Medium下的MultipleCommandAssembly

    1.首先创建一个控制台项目 2.添加引用[红色的都是将项目添加为引用,其中蓝色的log4net是直接从源代码下的Reference文件夹下引用的dll] 3.写代码 1)首先将config配置好[ht ...

  3. [HIHO1299]打折机票(线段树)

    题目链接:http://hihocoder.com/problemset/problem/1299 线段树,按照t为下标去更新v,更新的时候要保留最大的那个. #include <algorit ...

  4. c#换ip代理源码

    很多朋友都想如何提高自己的网站流量,可是都没有什么好的办法 经过很长时间的研究,在C#中实现了,当然了,这部分代码其中一部分是网上的,不是原创. using System; using System. ...

  5. linux软件的安装,更新与卸载

    Linux常见的安装为tar,zip,gz,rpm,deb,bin等.我们可以简单的分为三类. 第一:打包或压缩文件tar,zip,gz等,一般解压后即可,或者解压后运行sh文件: 第二:对应的有管理 ...

  6. openfire源码分析

    启动流程 Socket接口 Socket通信使用Mina框架实现,是XMPP协议的处理入口,具体为: 消息接收后由不同的节处理器处理: StanzaHandler基础消息类型,之后进行消息路由: 最后 ...

  7. 51nod1244 莫比乌斯函数之和

    推公式.f[n]=1-∑f[n/i](i=2...n).然后递归+记忆化搜索.yyl说这叫杜教筛?时间复杂度貌似是O(n 2/3)的? #include<cstdio> #include& ...

  8. 在页面中使用js

    JavaScript:用来在页面编写特效的,和HTML\CSS一样当都是由浏览器解析 JavaScript语言 一.JS如何运行(JavaScript,jscript,VbScript,applet ...

  9. HDU 1023 Train Problem II (卡特兰数,经典)

    题意: 给出一个数字n,假设火车从1~n的顺序分别进站,求有多少种出站序列. 思路: 卡特兰数的经典例子.n<101,用递推式解决.需要使用到大数.n=100时大概有200位以下. #inclu ...

  10. 流程引擎的API和服务基础

    RepositoryService :  管理和控制 发布包 和 流程定义(包含了一个流程每个环节的结构和行为) 的操作 除此之外,服务可以 查询引擎中的发布包和流程定义. 暂停或激活发布包,对应全部 ...