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+m2步分成两部分,然后分别进行搜索,第一次搜索用一个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

方程的解数(meet in the middle)

SPOJ4580 ABCDEF(meet in the middle)

折半搜索(meet in the middle)

Codeforces 835 F. Roads in the Kingdom

E. XOR Guessing(Meet in the Middle)