[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;
}
相关推荐
学习路上的小刘几秒前
vue h5 蓝牙连接 webBluetooth API
前端·javascript·vue.js
&白帝&1 分钟前
vue3常用的组件间通信
前端·javascript·vue.js
凌肖战2 分钟前
力扣上刷题之C语言实现(数组)
c语言·算法·leetcode
小白小白从不日白12 分钟前
react 组件通讯
前端·react.js
陈大爷(有低保)16 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
秋夫人28 分钟前
B+树(B+TREE)索引
数据结构·算法
Redstone Monstrosity29 分钟前
字节二面
前端·面试
kinlon.liu30 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
东方翱翔36 分钟前
CSS的三种基本选择器
前端·css
王哲晓1 小时前
Linux通过yum安装Docker
java·linux·docker