hiho1509 异或排序
题目大意:
给定一个长度为 n 的非负整数序列 a[1..n]
你需要求有多少个非负整数 S 满足以下两个条件:
(1).0 ≤ S < 260
(2).对于所有 1 ≤ i < n ,有 (a[i] xor S) ≤ (a[i+1] xor S)
1 ≤ n ≤ 50
0 ≤ a[i] < 260
-------------------------------------------------------------------------------------
开始看到题感觉无从下手,分析了一下才发现是到水题。
维护一个60位的标记数组,用来表示S的第i位可以放置的数(11为置01都可,01为只可置0,10为只可置1,00为都不能放)。初始状态为11。
开始时n个数在一个组内,要满足条件(2),n个数的最高位必须满足
1)全部为0或1;这时候该位可以放0或者1。
2)前几个数最高位为0,后面的数为1.(或者反过来),但不会出现01交替出现的情况;这时候该位只能放0或者1.
对于情况1)仍把改组扔到次高位处理。
对于情况2)可以把该组分成两组扔到次高位处理。
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #define MAX(a,b) ((a)>=(b)?(a):(b))
#define MIN(a,b) ((a)<=(b)?(a):(b))
#define OO 0x0fffffff
using namespace std;
typedef long long LL;
const int N = ;
int digits[N][N];
void getDigits(int id,LL data){
for(int i=;i<;i++){
digits[id][i]=(data&1L);
data>>=;
}
}
int choice[N];
int n;
LL data;
struct Node{
int level;
int spos,epos;
int sdigit,scnt;
Node(int tlevel,int tspos,int tepos){
level = tlevel;
spos = tspos;
epos = tepos;
}
Node(){}
int length(){
return epos-spos+;
}
};
int main(){
cin>>n;
for(int i=;i<n;i++) {
cin>>data;
getDigits(i,data);
}
for(int i=;i<;i++) choice[i] = ; Node head(,,n-);
queue<Node> q;
q.push(head);
while(!q.empty()){
Node cur = q.front(); q.pop();
cur.sdigit = digits[cur.spos][cur.level];
cur.scnt = ;
for(int r=cur.spos+;r<=cur.epos;r++){
if(digits[r][cur.level]==digits[r-][cur.level])
cur.scnt++;
else break;
}
if(cur.scnt==cur.length()){
choice[cur.level]&=;
if(cur.level)
q.push(Node(cur.level-,cur.spos,cur.epos));
}
else {
choice[cur.level]&=(cur.sdigit+);
if(cur.level){
q.push(Node(cur.level-,cur.spos,cur.spos+cur.scnt-));
q.push(Node(cur.level-,cur.spos+cur.scnt,cur.epos));
}
}
}
LL ans = ;
for(int i=;i<;i++){
if(!choice[i]) {
ans=;
break;
}
if(choice[i]==) ans*=;
}
printf("%lld\n",ans);
return ;
}
hiho1509 异或排序的更多相关文章
- hihoCoder挑战赛28 题目1 : 异或排序
题目1 : 异或排序 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个长度为 n 的非负整数序列 a[1..n] 你需要求有多少个非负整数 S 满足以下两个条件: ...
- [hihocoder1509][异或排序]
hihocoder1509 思路 对于每两个数,从二进制的高位到低位考虑,发现,若前面一个的当前位是1,后面一个的当前位置是0,那么s的当前位置必须是1.反之,若前面是0,后面是1,那么s的当前位置必 ...
- hihoCoder.1509.异或排序(位运算 思路)
题目链接 \(Description\) 给定长为\(n\)的序列\(A\).求有多少\(S\),满足\(0\leq S<2^{60}\),且对于所有\(i\in[1,n-1]\),\(a[i] ...
- hihocoder 1509 异或排序
题面在这里! 考虑前后两个数 x,y,可以发现S只有在(x xor y)的最高有1位上的取值是要被确定的 (如果x==y那么没有限制),可以推一下什么情况下是1/0. 于是我们模拟一下这个操作,判一判 ...
- hihocoder 1509异或排序
描述 给定一个长度为 n 的非负整数序列 a[1..n] 你需要求有多少个非负整数 S 满足以下两个条件: (1).0 ≤ S < 2^60 (2).对于所有 1 ≤ i < n ,有 ( ...
- HihoCoder#1509 : 异或排序(二进制)
题意 题目链接 Sol 挺简单的吧.考虑两个元素什么时候不满足条件 设\(a_i\)与\(a_i + 1\)最高的不同位分别为0 1,显然\(S\)的这一位必须为\(0\),否则这一位必须为\(1\) ...
- 【HIHOCODER 1509 】 异或排序
描述 给定一个长度为 n 的非负整数序列 a[1..n] 你需要求有多少个非负整数 S 满足以下两个条件: (1).0 ≤ S < 260 (2).对于所有 1 ≤ i < n ,有 (a ...
- 【hihoCoder挑战赛28 A】异或排序
[题目链接]:http://hihocoder.com/problemset/problem/1509 [题意] [题解] 每次找到相邻两个数的二进制形式中; 不同的最高位; 显然S在这一位必然是确定 ...
- 【Java数据结构与算法】简单排序、二分查找和异或运算
简单排序 选择排序 概念 首先,找到数组中最小的那个元素,其次,把它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和自己交换).再次,在剩下的元素中找到最小的元素,将它与数组的第二个 ...
随机推荐
- C# 正则表达式
C# 正则表达式 正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成. 定义正则表达式 下面列出了用于定义正则表达式的各种类 ...
- 服务端 | Nodejs 学习笔记(一)
Node.js 前言: 2009年面世 nodejs.org 官网 https://www.npmjs.com/ 模块社区 github.com 仓库 stackoverflow.com 问答社区 ...
- Django开发之路 一(django安装并测试运行)
安装Django与测试 1.虚拟环境的安装 一般来说Django的开发最好是在虚拟环境上进行,这样的好处是可以将不同的Django的项目的环境分割开来,相互不影响.比如说项目一用到Python2.x和 ...
- Tomcat转jboss踩的那些坑
问题背景 今天发版本,是一个httpclient的跳转(由于公司网络原因,所以对外网的访问都经过这个代理服务出去). 问题原因 之前的开发一直在window系统的tomcat服务器上进行的,对jbos ...
- update没带where,寻找问题的思路
数据库版本:5.6.16 前几天,在测试环境中,不知道为什么突然之间,所有的一个字段值全部变成了12,需要将备份还原后开发重新清理垃圾数据并开始测试. 在开发提供 SQL语句的情况下,能否查到是谁做了 ...
- JSTL教程 [JSP 标准标记库]
JSTL教程- - JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管理格式 ...
- Could not Open Install.Log File解决方法
很多时候我们使用控制面板卸载软件会遇到could not open install.log file的报错,最近我也遇到了一次.之前遇到这样的问题,很多人都会选择直接删除软件安装目录和快捷方式等等.这 ...
- 「JavaSE 重新出发」05.03.02 在运行时使用反射分析对象
在编写程序时,如果知道想要查看的域名和类型,查看指定的域是一个很容易的事,而利用反射机制可以查看在编译时还不清楚的对象域. java Employee tank = new Employee(&quo ...
- POJ 1458 Common Subsequence 【最长公共子序列】
解题思路:先注意到序列和串的区别,序列不需要连续,而串是需要连续的,先由样例abcfbc abfcab画一个表格分析,用dp[i][j]储存当比较到s1[i],s2[j]时最长公共子序 ...
- vue 移动端项目,动态控制div距离底部的距离
<template> <div class="details"> <com-nav-bar title="保险详情"> &l ...