题目大意:
给出长度为n-1的两个数组a和b,要求找出一个长度为n的数组t,使得t[i]|t[i+1]=a[i] && t[i]&t[i+1]=b[i],问是否存在这样的数组t
题解:
因为数组元素的值只有0-3,所以包着试一试的心态直接写了发dfs就过了
赛后看大佬说数组t应该具有唯一性,所以在dfs中出口很很少的,所以就过了
cf遇到的第一个纯dfs题
#include <bits/stdc++.h> #include <cstring> #define ll long long using namespace std; int t[100010]; int a[100010],b[100010]; int n; void dfs(int x) { if(x<1) { puts("YES"); for(int i=1;i<n;++i) printf("%d ",t[i]); printf("%d\n",t[n]); exit(0); } for(int i=0;i<=3;++i) { if((i|t[x+1])==a[x] && (i&t[x+1])==b[x]) { t[x]=i; dfs(x-1); } } } int main() { //freopen("input.txt","r",stdin); scanf("%d",&n); for(int i=1;i<n;++i) scanf("%d",&a[i]); for(int i=1;i<n;++i) scanf("%d",&b[i]); for(int i=0;i<=3;++i) { t[n]=i; dfs(n-1); } puts("NO"); return 0; }
