[NOI2014] 起床困难综合症

[NOI2014] 起床困难综合症

题目描述

21 21 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳。作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争。通过研究相关文献,他找到了该病的发病原因:在深邃的太平洋海底中,出现了一条名为 drd 的巨龙,它掌握着睡眠之精髓,能随意延长大家的睡眠时间。正是由于 drd 的活动,起床困难综合症愈演愈烈,以惊人的速度在世界上传播。为了彻底消灭这种病,atm 决定前往海底,消灭这条恶龙。历经千辛万苦,atm 终于来到了 drd 所在的地方,准备与其展开艰苦卓绝的战斗。drd 有着十分特殊的技能,他的防御战线能够使用一定的运算来改变他受到的伤害。具体说来,drd 的防御战线由 n n n 扇防御门组成。每扇防御门包括一个运算 o p op op 和一个参数 t t t,其中运算一定是 OR , XOR , AND \text{OR},\text{XOR},\text{AND} OR,XOR,AND 中的一种,参数则一定为非负整数。如果还未通过防御门时攻击力为 x x x,则其通过这扇防御门后攻击力将变为 x o p t x~op~t x op t。最终 drd 受到的伤害为对方初始攻击力 x x x 依次经过所有 n n n 扇防御门后转变得到的攻击力。

由于 atm 水平有限,他的初始攻击力只能为 0 0 0 到 m m m 之间的一个整数(即他的初始攻击力只能在 0 , 1 , ... , m 0,1,\ldots,m 0,1,...,m 中任选,但在通过防御门之后的攻击力不受 m m m 的限制)。为了节省体力,他希望通过选择合适的初始攻击力使得他的攻击能让 drd 受到最大的伤害,请你帮他计算一下,他的一次攻击最多能使 drd 受到多少伤害。

输入格式

输入文件的第 1 1 1 行包含 2 2 2 个整数,依次为 n , m n, m n,m,表示 drd 有 n n n 扇防御门,atm 的初始攻击力为 0 0 0 到 m m m 之间的整数。

接下来 n n n 行,依次表示每一扇防御门。每行包括一个字符串 o p op op 和一个非负整数 t t t,两者由一个空格隔开,且 o p op op 在前, t t t 在后, o p op op 表示该防御门所对应的操作, t t t 表示对应的参数。

输出格式

输出一行一个整数,表示 atm 的一次攻击最多使 drd 受到多少伤害。

样例 #1

样例输入 #1

3 10
AND 5
OR 6
XOR 7

样例输出 #1

1

提示

【样例说明】

atm 可以选择的初始攻击力为 0 , 1 , ... , 10 0,1,\ldots ,10 0,1,...,10。

假设初始攻击力为 4 4 4,最终攻击力经过了如下计算

  • 4 AND 5 = 4 4 \text{ AND } 5 = 4 4 AND 5=4;
  • 4 OR 6 = 6 4 \text{ OR } 6 = 6 4 OR 6=6;
  • 6 XOR 7 = 1 6 \text{ XOR } 7 = 1 6 XOR 7=1。

类似的,我们可以计算出初始攻击力为 1 , 3 , 5 , 7 , 9 1,3,5,7,9 1,3,5,7,9 时最终攻击力为 0 0 0,初始攻击力为 0 , 2 , 4 , 6 , 8 , 10 0,2,4,6,8,10 0,2,4,6,8,10 时最终攻击力为 1 1 1,因此atm的一次攻击最多使drd受到的伤害值为 1 1 1。

【数据规模与约定】

  • 特殊性质 A \mathrm A A:存在一扇防御门为 AND 0 \texttt{AND 0} AND 0;
  • 特殊性质 B \mathrm B B:所有防御门的操作均相同。

对于所有数据,保证 2 ≤ n ≤ 1 0 5 2\le n\le 10^5 2≤n≤105, 0 ≤ m ≤ 1 0 9 0\le m\le 10^9 0≤m≤109, 0 ≤ t ≤ 1 0 9 0\le t\le 10^9 0≤t≤109,且 o p \mathrm{op} op 一定为 AND , OR , XOR \verb!AND!,\verb!OR!,\verb!XOR! AND,OR,XOR 中的一种。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
long long s,q,w,e,r,t,a,y,u,i,o,p,d,f,g,h,j,k,l,z,x,c,v,b,n,m,aaa[100005],a1,a2;
char aa[5],lj;
int main()
{
	cin>>n>>m;
    a2=-1;
	while(n--)
    {
		scanf("%s%d",aa,&x);
		if(aa[0]=='A') a1&=x, a2&=x;
		if(aa[0]=='X') a1^=x, a2^=x;
		if(aa[0]=='O') a1|=x, a2|=x;
	}
	for(int j=29;~j;--j)
    {
		if(a1>>j&1) 
        s+=1<<j;
		else if(a2>>j&1&&(1<<j)<=m) 
        s+=1<<j, m-=1<<j;
	} 
    cout<<s;
	return 0;
}
相关推荐
m0_748235612 分钟前
从零开始学前端之HTML(三)
前端·html
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人1 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
半盏茶香1 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
忘梓.2 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
算法·动态规划
一个处女座的程序猿O(∩_∩)O2 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
suweijie7683 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿4 小时前
List深拷贝后,数据还是被串改
java
tinker在coding4 小时前
Coding Caprice - Linked-List 1
算法·leetcode