F. Xor-Paths(Meet in the Middle)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了F. Xor-Paths(Meet in the Middle)相关的知识,希望对你有一定的参考价值。
F. Xor-Paths(Meet in the Middle)
折半搜索,走 n + m − 2 n+m-2 n+m−2步分成两部分,然后分别进行搜索,第一次搜索用一个map维护答案,然后第二次搜索计算贡献即可。
// Problem: F. Xor-Paths
// Contest: Codeforces - Codeforces Round #498 (Div. 3)
// URL: https://codeforces.ml/problemset/problem/1006/F
// Memory Limit: 256 MB
// Time Limit: 3000 ms
// Date: 2021-07-27 14:14:51
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=21,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
}
int n,m,half,other;
ll k;
map<ll,int>b[N][N];
ll a[N][N],ans;
void dfs(int x,int y,ll v,int c){
v^=a[x][y];
if(c==half){
b[x][y][v]++;return;
}
if(x+1<n) dfs(x+1,y,v,c+1);
if(y+1<m) dfs(x,y+1,v,c+1);
}
void dfs1(int x,int y,ll v,int c){
if(c==other){
if(b[x][y].count(v^k)) ans+=b[x][y][v^k];
return;
}
if(x-1>=0) dfs1(x-1,y,v^a[x][y],c+1);
if(y-1>=0) dfs1(x,y-1,v^a[x][y],c+1);
}
int main(){
scanf("%d%d%lld",&n,&m,&k);half=(n+m-2)/2;other=n+m-2-half;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) scanf("%lld",&a[i][j]);
dfs(0,0,0,0);
dfs1(n-1,m-1,0,0);
printf("%lld\\n",ans);
return 0;
}
以上是关于F. Xor-Paths(Meet in the Middle)的主要内容,如果未能解决你的问题,请参考以下文章
状态压缩 meet in middlepoj3139Balancing the Scale
SPOJ4580 ABCDEF(meet in the middle)