题目大意:
给一个整数n,和一个长度为2^n的字符串,对这个字符串进行n次操作,每次操作可以选&、|、 ^ 中的一种,操作前字符串长度为k,那么对1<= i <= (k/2),将s(i2-1)s(i2)替换为这两个数的计算结果,问有多少种选择方式,让最后得到的字符串为1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[20][300000];
int n;
ll dfs(int x,int len)
{
len/=2;
ll l=0;
ll res=0,a1=0,a2=0,a3=0;
for(int i=1;i<=len;i++)
{
a[x][i]=a[x-1][i*2-1]&a[x-1][i*2];
if(a[x][i]==0)l++;
}
if(l==len) a1=0;
else if(l==0)a1=len;
else a1=dfs(x+1,len);
l=0;
for(int i=1;i<=len;i++)
{
a[x][i]=a[x-1][i*2-1]|a[x-1][i*2];
if(a[x][i]==0)l++;
}
if(l==len) a2=0;
else if(l==0)a2=len;
else a2=dfs(x+1,len);
l=0;
for(int i=1;i<=len;i++)
{
a[x][i]=a[x-1][i*2-1]^a[x-1][i*2];
if(a[x][i]==0)l++;
}
if(l==len) a3=0;
else if(l==0)a3=len;
else a3=dfs(x+1,len);
return a1+a2+a3;
}
int main() {
cin>>n;
int len;
string x;
cin>>x;
len=x.size();
for(int i=0;i<len;i++)a[0][i+1]=x[i]-'0';
ll ans=dfs(1,len);
cout<<ans<<endl;
return 0;
}