题目大意

有一个 n×mn\times m 的网格,每个网格可以填 002k12^k-1 范围内的数字。现在从左上角走到右下角,每次可以选择往右边或往下走一步。如果路径上所有数字异或和为 00,称这样的路径为好路径。给定一条路径 ssD\texttt{D} 表示往下走,R\texttt{R} 表示往右走。问,是否存在一个网格,使得这条路径 ss 是唯一的好路径。

思路

考虑用最少的数字填完整个表格,假设数字范围为 002t12^t-1,只要 tkt\le k,就满足情况,否则不满足情况。

对于给定的路线 ss,异或和为 00,可以将路径上所有位置全部设置为 00

考虑在路线 ss 变化 11 步的路线,也就是拐角处。为了让这些路线异或和不为 00,分别填 20,21,232^0,2^1,2^3\cdots,同时在同一条斜线上填同样的数字,其余位置填 00。这样保证你只要走了路线 ss 之外的线路,在最终的异或和上都会出现新的 11

但这样不是最优的,可以发现,如果出现连续的 22 个拐弯,22 个拐角可以填相同的数字。

同理可以模拟出 33 个连续的拐角需要 22 个不同的数字,
44 个连续的拐角需要 22 个不同的数字,如果有 xx 个连续的拐角,那么 x/2x/2 个不同的数组。

时间复杂度为 O(T(n+m))O(T(n+m))

AC Code

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=105;
int n,m,k;
char a[N];
void solve(){
	cin>>n>>m>>k>>a+1;
	for(int i=1;i<n+m-2;i++) if(a[i]!=a[i+1]) i++,k--;
	if(k>=0) cout<<"Yes\n";
	else cout<<"No\n";
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int T;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}