题目大意:
给出长度为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;
}