Submission #720031

#TimeUsernameProblemLanguageResultExecution timeMemory
720031dozerSnake Escaping (JOI18_snake_escaping)C++14
22 / 100
518 ms34112 KiB
#include <bits/stdc++.h>
using namespace std;
#define sp " "
#define endl "\n";
#define fastio() cin.tie(0), ios_base::sync_with_stdio(0)
#define pb push_back
#define pii pair<int, int>
#define st first
#define nd second
#define N 9005
//#define int long long

const int modulo = 1e9 + 7;


int arr[N], ans[1000006];

int32_t main()
{
	fastio();

	int l, q;
	cin>>l>>q;
	for (int i = 0; i < (1<<l); i++)
	{
		char tmp;
		cin>>tmp;
		arr[i] = tmp - '0';
	}

	vector<pair<pii, int>> que;

	for (int j = 1; j <= q; j++)
	{
		int s = 0, t = 0;
		for (int i = l - 1; i >= 0; i--)
		{
			char tmp;
			cin>>tmp;
			if (tmp == '?') t |= (1<<i);
			else if (tmp == '1') s |= (1<<i);
		}
		que.pb({{s, t}, j});
	}

	sort(que.begin(), que.end());

	for (int i = 0; i < q; i++)
	{
		int s = que[i].st.st, t = que[i].st.nd, ind = que[i].nd;
		if (i > 0)
		{
			if (s == que[i - 1].st.st && t == que[i - 1].st.nd)
			{
				ans[ind] = ans[que[i - 1].nd];
				continue;
			}
		}
		for (int j = t; j != 0; j = (j - 1) & t)
			ans[ind] += arr[s | j];
		ans[ind] += arr[s];
	}

	for (int i = 1; i <= q; i++)
		cout<<ans[i]<<endl;

	cerr << "time taken : " << (float)clock() / CLOCKS_PER_SEC << " seconds\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...