This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef long double ld;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;
ii queries[1000011];
char a[(1<<20)+12];
int ans[1000011];
const int N = 1594323;
const int LG = 13;
const int N2 = 2187;
const int LG2 = 7;
int dp[N+3];
int nxt[N+3][2];
bitset<(1<<LG2)+1> subbit[N2+3];
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
for(int i=0;i<N;i++)
{
int cur=i; bool pos=0; int t=1;
for(int j=LG-1;j>=0;j--)
{
if(cur%3==2)
{
nxt[i][1] = i - t;
nxt[i][0] = i - t - t;
pos=1; break;
}
cur/=3; t*=3;
}
if(!pos)
{
nxt[i][0]=nxt[i][1]=-1;
}
}
for(int i=0;i<N2;i++)
{
int tmp[LG2+1]={};
int cur=i;
for(int j=LG2-1;j>=0;j--)
{
tmp[j] = cur%3;
cur/=3;
}
for(int j=0;j<(1<<LG2);j++)
{
bool pos=1; int cur2=j;
for(int k=LG2-1;k>=0;k--)
{
int t=cur2&1; cur2>>=1;
if(tmp[k]==2) continue;
if(tmp[k]==t) continue;
pos=0; break;
}
if(pos) subbit[i].set(j,1);
}
}
int l,q; cin>>l>>q;
cin>>a;
for(int i=0;i<q;i++)
{
char x[21]; cin>>x;
for(int j=0;j<min(l,LG2);j++)
{
queries[i].fi*=3;
queries[i].fi+=(x[j]=='0'?0:(x[j]=='1'?1:2));
}
for(int j=LG2;j<l;j++)
{
queries[i].se*=3;
queries[i].se+=(x[j]=='0'?0:(x[j]=='1'?1:2));
}
}
int rhs = max(0, l - LG2);
for(int i=0;i<(1<<min(l,LG2));i++)
{
for(int j=0;j<N;j++)
{
if(nxt[j][0]==-1)
{
int cur=j; int bit = 0;
for(int k=0;k<rhs;k++)
{
if(cur%3) bit^=(1<<k);
cur/=3;
}
dp[j] = a[(i<<rhs)^bit]-'0';
}
else
{
dp[j] = dp[nxt[j][0]]+dp[nxt[j][1]];
}
}
for(int j=0;j<q;j++)
{
if(subbit[queries[j].fi][i])
{
ans[j] += dp[queries[j].se];
}
}
}
for(int i=0;i<q;i++)
{
cout<<ans[i]<<'\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |