[CodeForces]1006F Xor Path

双向搜索。
水div3的时候最后一道题由于C题死活看不懂题 来不及做F了Orz。。
因为n,m是20,双向搜索一下,求个到中间的Xor值的方案,统计一下即可。
时间复杂度\(O(2^{21})\)
好好学习英语,readforces。。。

#include <bits/stdc++.h>
using namespace std;
int n,m;
long long k,g[55][55],ans,mid;
map<long long,long long> cnt[22][22];
void dfs1(int x,int y,long long sum) {

    if(x+y>mid+1) return;
    if(x>n||y>m) return;
    sum^=g[x][y];
    cnt[x][y][sum]++;
    dfs1(x+1,y,sum);
    dfs1(x,y+1,sum);
}
void dfs2(int x,int y,long long sum) {
    if(x<1||y<1) return;
    if(x+y<=mid+1) {
        ans+=cnt[x][y][sum^k];
        return;
    }
    sum^=g[x][y];
    dfs2(x-1,y,sum);
    dfs2(x,y-1,sum);
}
int main() {
    scanf("%d%d%lld",&n,&m,&k);
    mid=n+m>>1;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            scanf("%lld",&g[i][j]);
    dfs1(1,1,0);
    dfs2(n,m,0);
    cout<<ans;
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9338573.html