Submission #1007735

#TimeUsernameProblemLanguageResultExecution timeMemory
1007735ihneSnake Escaping (JOI18_snake_escaping)C++17
100 / 100
1041 ms54868 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define pii pair<int,int>
#define pb push_back
const int mn=1e5+5;
const int mod=1e9+7;
int dp[1100000][2];
int a[1100000];
signed main(){
  //freopen("","r",stdin);
  //freopen("","w",stdout);
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int l,q;
  cin>>l>>q;
  for (int i=0;i<(1<<l);i++){
    char c;
    cin>>c;
    dp[i][0]=c-'0';
    dp[i][1]=c-'0';
    a[i]=c-'0';
  }
  for (int i=0;i<l;i++){
    for (int mask=0;mask<(1<<l);mask++){
      if (mask>>i&1){
        dp[mask][0]+=dp[mask^(1<<i)][0];
      }
    }
  }
  for (int i=0;i<l;i++){
    for (int mask=(1<<l)-1;mask;mask--){
      if (mask>>i&1){
        dp[mask^(1<<i)][1]+=dp[mask][1];
      }
    }
  }
  while (q--){
    string s;
    cin>>s;
    vector<int> pos,p0,p1;
    int c0=0,c1=0,c2=0;
    int m=0;
    for (int i=0;i<l;i++){
      if (s[i]=='0') {
        c0++;
        p0.pb(i);
      }
      else if (s[i]=='1'){
        c1++;
        m^=(1<<(l-i-1));
        p1.pb(i);
      }
      else {
        c2++;
        pos.pb(i);
      }
    }
    int ans=0;
    if (c0<=6){
      for (int mask=0;mask<(1<<c0);mask++){
        int msk=m;
        int cnt=0;
        for (int i=0;i<c0;i++){
          if (mask>>i&1) {
            msk^=(1<<(l-p0[i]-1));
          }
          else cnt++;
        }
        if ((cnt&1)==(c0&1))ans+=dp[msk][1];
        else ans-=dp[msk][1];
      }
    }
    else if (c1<=6){
      for (int i=0;i<c2;i++){
        m^=(1<<(l-pos[i]-1));
      }
      for (int mask=0;mask<(1<<c1);mask++){
        int msk=m;
        int cnt=0;
        for (int i=0;i<c1;i++){
          if (mask>>i&1) cnt++;
          else{
            msk^=(1<<(l-p1[i]-1));
          }
        }
        if ((cnt&1)==(c1&1))ans+=dp[msk][0];
        else ans-=dp[msk][0];
      }
    }
    else{
      for (int mask=0;mask<(1<<c2);mask++){
        int msk=m;
        for (int i=0;i<c2;i++){
          if (mask>>i&1) msk+=(1<<(l-pos[i]-1));
        }
        ans+=a[msk];
      }
    }
    cout<<ans<<"\n";
  }
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...