Kattis xorsequences XOR Sequences

Link
先考虑一个结论,对于\(a,b\)两个非负整数,\(a\operatorname{xor}c\)\(b\operatorname{xor}c\)的大小关系仅取决于\(c\)\(a,b\)最高不同位这一位。
考虑对比\(p_i,p_{i+2^{m-1}}\)
\(a_i\)的最高位都相同,那么\(\forall i\in[0,2^{m-1}),p_i=p_{i+2^{m-1}}\),且此时\(a_i\)的最高位有\(0,1\)两种选择。然后我们可以把\(a_i\)的最高位去掉,递归考虑\(p_0,\cdots,p_{2^{m-1}-1}\)
否则\(\{p_i|i\in[0,2^{m-1})\}\cap\{p_i|i\in[2^{m-1},2^m)\}=\varnothing\),且此时所有\(a_i\)的最高位都是确定的。然后我们可以把\(a_i\)的最高位去掉,递归考虑\(p_0,\cdots,p_{2^{m-1}-1}\)\(p_{2^{m-1}},\cdots,p_{2^m-1}\)
那么我们只需要判断\(\{p\}\)是否满足上述条件中的任意一个即可,若两个都无法满足则说明无解。

#include<set>
#include<cstdio>
#include<vector>
using vec=std::vector<int>;
const int P=1000000007;
int ans=1,n,m;
int read(){int x;scanf("%d",&x);return x;}
void mul(int&x){x+=x-P,x+=x>>31&P;}
void solve(vec a,int d)
{
    if(!~d) return ;
    vec l=vec(a.begin(),a.begin()+(1<<d)),r=vec(a.begin()+(1<<d),a.end());int f=1;std::set<int>s;
    for(int i=0;i<1<<d;++i) f&=l[i]==r[i];
    if(f) return solve(l,d-1),mul(ans),void();
    for(int x:l) s.insert(x);
    for(int x:r) if(s.count(x)) ans=0;
    solve(l,d-1),solve(r,d-1);
}

int main()
{
    m=read(),n=read();vec a(1<<m);
    for(int i=0;i<1<<m;++i) a[i]=read();
    solve(a,m-1),printf("%d",ans);
}
posted @ 2020-04-07 20:03  Shiina_Mashiro  阅读(268)  评论(0编辑  收藏  举报