Codeforces Round #440 (Div. 1) B. Something with XOR Query

来源:互联网 发布:税收数据质量管理 编辑:程序博客网 时间:2024/05/06 16:05

题目大意

给一个排列p和每个数对应的位置b,你可以询问2n次,每次两个数i,j,返回p[i]^b[j],求最后如果询问n^2次都不能确定的排列个数。

题解

询问所有0,i和i,0,之后就能得知所有数的两两异或(a[i][j]=a[i][0] ^ a[0][j] ^a[0][0]),然后就枚举第一个数是什么,暴力计算即可。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int read(){    char ch=getchar();int f=0;    while(ch<'0'||ch>'9') ch=getchar();    while(ch>='0'&&ch<='9') {f=f*10+(ch^48);ch=getchar();}    return f;}int num[5005][5005],a[5005],b[5005],ans[5005];bool vis[50005];int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        printf("? %d %d\n",0,i);        fflush(stdout);        int x;        scanf("%d",&x);        num[0][i]=x;    }    for(int i=1;i<n;i++)    {        printf("? %d %d\n",i,0);        fflush(stdout);        int x;        scanf("%d",&x);        num[i][0]=x;    }    for(int i=1;i<n;i++)    {        for(int j=1;j<n;j++)        {            num[i][j]=num[0][0]^num[i][0]^num[0][j];        }    }    int first=-1,sum=0;    for(int i=0;i<n;i++)    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        a[0]=i;bool ac=1;        for(int j=0;j<n;j++)        {            b[j]=(num[0][j]^a[0]);        }        for(int j=1;j<n;j++)        {            a[j]=(num[j][0]^b[0]);        }        memset(vis,0,sizeof(vis));        for(int j=0;j<n;j++)        {            if(!vis[a[j]]&&a[j]<n)            {                vis[a[j]]=1;            }            else            {                ac=0;                break;            }        }        if(ac)        {            for(int j=0;j<n;j++)            {                if(b[j]<n&&a[b[j]]!=j)                {                    ac=0;                    break;                }            }        }        if(ac)        {            sum++;            if(first==-1)            {                first=i;                for(int j=0;j<n;j++)                {                    ans[j]=a[j];                }            }        }    }    printf("!\n");    printf("%d\n",sum);    for(int i=0;i<n;i++)    {        printf("%d ",ans[i]);    }    fflush(stdout);}
原创粉丝点击