异或密码
来自中国大学生程序设计大赛的一道题。主要考察的是读题能力,穷举就可以了,总共100*100的。
把所有情况放在一个二维数组里面,第一行是单个一个的,第二行是两个异或,第三行放三个连续异或,类推到第n行,最后筛选结果。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
int a[102],b[102];
int Map[102][102];
int main()
{
int i,j,t,n,k,A,m;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
memset(Map,0,sizeof(Map));
for(i=0; i<n; i++)
{
for(j=0; j<n-i; j++)
{
for(k=j; k<=j+i; k++)
Map[i][j]=Map[i][j]^a[k];
//printf("%d ",Map[i][j]);
}
//printf("\n");
}
scanf("%d",&m);
int l;
for(k=0; k<m; k++)
{
int minl=0xfffffff;
scanf("%d",&b[k]);
for(i=0; i<n; i++)
{
for(j=0; j<n-i; j++)
{
if(abs(Map[i][j]-b[k])<minl)
{
minl=abs(Map[i][j]-b[k]);
l=i+1;
}
if(i+1>l&&abs(Map[i][j]-b[k])==minl)
l=i+1;
}
}
printf("%d\n",l);
}
printf("\n");
}
return 0;
}