Codeforces Round #498 (Div. 3) (双向dfs)
F. Xor-Paths
题意:给你一个n*m的矩阵和一个k,问从(1,1)到(n,m)的最短路径中,路径上每个点的异或值的总和的为k的路径数目为多少。
思路:折半枚举,通过(1,1)dfs到(i,j)点的所有可能路径的所有结果,其中i+j==max(n,m),将所有在(i,j)的结果存储起来;
反向枚举,从(n,m)dfs到(u,v)点的所有可能路径的结果,其中u+v==max(n,m)+1;
然后从每一个(u,v)点开始匹配,根据结果枚举另一半可能结果,分别在(u-1,v)和(u,v-1)点上查找相应的结果,其中u-1+v=u+v-1=max(n,m),(u-1,v)和(u,v-1)点都是第一次dfs计算出来的结果,具体代码如下:
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
const int maxn=300000+10;
const int INF=int(1e8);
#define ll long long
map<ll,ll>maps[25][25];