这道题的正解其实没什么好说的,反而是部分分设计非常巧妙。

  之所以要单开一篇是因为当时机房的部分同学刚学位运算,我拿这个题去讲想毒瘤大家一下,于是做了一个挺好看的课件。

  ppt -> pdf -> jpg 是真的麻烦。(最后也没成功)

  开始一个大工程...手工截图!

  起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

起床困难综合症 NOI_2014_D1T1-LMLPHP

最后贴一下代码。

# include <cstdio>
# include <iostream>
# include <cmath>
# define R register int using namespace std; int xx,n,Max=,M,h=,d[],y[],m[],ans[];
long long Ans=;
char a[];
char cc;
bool now,f=true; bool check(bool x,int l)
{
for (R i=;i<=n;i++)
{
now=d[i]&(<<(l-));
if(y[i]==) x=x&now;
if(y[i]==) x=x^now;
if(y[i]==) x=x|now;
}
return x;
} int read()
{
xx=;
cc=getchar();
while (!isdigit(cc)) cc=getchar();
while (isdigit(cc)) xx=(xx<<)+(xx<<)+(cc^),cc=getchar();
return xx;
} int main()
{
cin>>n>>M;
for (R i=;i<=n;i++)
{
scanf("%s",a);
d[i]=read();
if(a[]=='A') y[i]=;
if(a[]=='X') y[i]=;
if(a[]=='O') y[i]=;
Max=max((int)log2(d[i])+,Max);
}
while (M)
{
m[++h]=M&;
M=M>>;
}
Max=max(Max,h)+;
for (R i=Max;i>=;i--)
{
if((m[i]==||f==false)&&check(,i)==&&check(,i)==)
ans[i]=;
else
{
if(check(,i)) ans[i]=;
if(m[i]==) f=false;
}
}
for (R i=Max;i>=;i--)
Ans=(Ans<<)|ans[i];
cout<<Ans;
return ;
}

起床困难综合症

05-11 17:23