Submission #391308

# Submission time Handle Problem Language Result Execution time Memory
391308 2021-04-18T13:33:47 Z hhhhaura Snake Escaping (JOI18_snake_escaping) C++14
0 / 100
1 ms 352 KB
#define wiwihorz
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma loop-opt(on)

#define rep(i, a, b) for(int i = a; i <= b; i++)
#define rrep(i, a, b) for(int i = b; i >= a; i--)
#define all(x) x.begin(), x.end()
#define ceil(a, b) for(int i = a; i <= b; i++)

#define INF 1000000000000000000
#define MAXN 1000005
#define MOD 1000000007
#define eps (1e-9)

#define int long long int
#define lld long double
#define pii pair<int, int>
#define random mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count())

using namespace std;
#ifdef wiwihorz
#define print(a...) kout("[" + string(#a) + "] = ", a )
void vprint(auto L, auto R) { while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
void kout() { cerr << endl; }
template<class T1, class ... T2> void kout(T1 a, T2 ... e) { cerr << a << " ",kout(e...);}
#else 
#define print(...) 0
#define vprint(...) 0
#endif
namespace solver {
	int L; string s;
	vector<int> sp, sb, cnt;
	void init_(int _L, string _s) {
		L = _L, s = _s;
		sp.assign(1 << L, 0);
		sb.assign(1 << L, 0);
		cnt.assign(1 << L, 0);
		
		rep(i, 0, (1 << L) - 1) {
			sp[i] = s[i] - '0';
			sb[i] = s[i] - '0';
			cnt[i] = __builtin_popcount(i);
		}
		rep(i, 0, L - 1) {
			rep(j, 0, (1 << L) - 1) 
				if(!((j >> i) & 1)) sp[j] += sp[j ^ (1 << i)];
			rrep(j, 0, (1 << L) - 1) 
				if((j >> i) & 1) sb[j] += sb[j ^ (1 << i)];
		}
	}
	int query(string a) {
		int A = 0, B = 0, C = 0;
		rep(i, 0, L - 1) {
			if(a[i] == '1') B |= (1 << (L - 1 - i));
			else if(a[i] == '0') A |= (1 << (L - 1 - i));
			else C |= (1 << (L - 1 - i));
		}
		int mn = min({cnt[A], cnt[B], cnt[C]});
		if(cnt[A] == mn) { 
			int ans = sp[B];
			for(int i = A; i > 0; i = (i - 1) & A) {
				ans += sp[i | B] * ((cnt[i] & 1) ? -1 : 1);
			}
			return ans;
		}
		else if(cnt[B] == mn) { 
			int ans = sb[C] * ((cnt[B] & 1) ? -1 : 1);
			for(int i = B; i > 0; i = (i - 1) & B) {
				ans += sb[C | i] * (((cnt[B] - cnt[i]) & 1) ? -1 : 1);
			}
			return ans;
		}
		else {
			int ans = s[B];
			for(int i = C; i > 0; i = (i - 1) & C) {
				ans += s[B | i];
			}
			return ans;
		}
	} 
};
using namespace solver;
signed main() {
	ios::sync_with_stdio(false), cin.tie(0);
	int L, Q; cin >> L >> Q;
	string s; cin >> s;
	init_(L, s);
	rep(i, 1, Q) {
		string cur; cin >> cur;
		cout << query(cur) << "\n";
	}
	return 0;
}

Compilation message

snake_escaping.cpp:4: warning: ignoring #pragma loop  [-Wunknown-pragmas]
    4 | #pragma loop-opt(on)
      | 
snake_escaping.cpp:24:13: warning: use of 'auto' in parameter declaration only available with '-fconcepts'
   24 | void vprint(auto L, auto R) { while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
      |             ^~~~
snake_escaping.cpp:24:21: warning: use of 'auto' in parameter declaration only available with '-fconcepts'
   24 | void vprint(auto L, auto R) { while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
      |                     ^~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Incorrect 1 ms 352 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Incorrect 1 ms 352 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Incorrect 1 ms 352 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Incorrect 1 ms 352 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Incorrect 1 ms 352 KB Output isn't correct
4 Halted 0 ms 0 KB -