问题描述
输入
输出
样例输入
input 1:
6 3
1 1 1 0 0 0
input 2:
6 3
1 1 0 1 0 0
input 3:
6 3
11 8 2 1 3 9
样例输出
output 1
1 1
output 2
1 0
output 3
11 1
算法讨论
或就是全部或起来,与就是恰好k个,按位处理每一位的答案就好。
#include <cstdio>
#define MAX_N 1000006
using namespace std;
int a[MAX_N],e[MAX_N][35],p[MAX_N],P,n,k,s1,s2,t,h;
bool f[MAX_N][35];
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
{
int x=0,xx;
scanf("%d",&a[i]);
s1|=a[i];
xx=a[i];
while (xx!=0)
{
e[i][++x]=xx & 1;
xx>>=1;
}
if (x>h)
h=x;
p[i]=i;
}
for (int i=h;i>=1;i--)
{
int x=0;
bool flag=0;
for (int j=1;j<=n;j++)
{
if (e[j][i]==1)
{
x++;
if (x>=k)
flag=1;
}
else
{
x=0;
flag=0;
}
if (flag)
f[j][i]=1;
}
}
int m=n; t=0;
for (int i=h;i>=1;i--)
{
if (t!=0)
{
m=t;
t=0;
}
for (int j=1;j<=m;j++)
if (f[p[j]][i])
p[++t]=p[j];
if (t==1)
break;
}
P=p[1];
s2=a[P-k+1];
for (int i=P-k+2;i<=P;i++)
s2&=a[i];
printf("%d %d",s1,s2);
}