제출 #204076

#제출 시각아이디문제언어결과실행 시간메모리
204076KastandaSnake Escaping (JOI18_snake_escaping)C++11
100 / 100
1435 ms40596 KiB
// In The Name Of The Queen #include<bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") using namespace std; const int N = 20, K = 12, M = 8, MXK = 531441, MXM = 6561, MAXQ = 1e6 + 9; // MXK = 3 ^ K, MXM = 3 ^ M int n, q, k, m, RS[MAXQ], Val[MAXQ]; int L[MXK], R[MXK], B[MXK], dp[MXK]; char A[1 << N], Tmp[N]; vector < int > Q[MXM]; int main() { scanf("%d%d%s", &n, &q, A); for (int i = 0; i < (1 << n); i ++) A[i] -= '0'; k = min(K, n); m = n - k; for (int i = 0; i < q; i ++) { scanf("%s", Tmp); for (int j = 0; j < n; j ++) { if (Tmp[j] == '?') Tmp[j] = '2'; Tmp[j] -= '0'; } int pref = 0; for (int j = 0; j < m; j ++) pref = (pref << 1) + pref + Tmp[j]; int suff = 0; for (int j = m; j < n; j ++) suff = (suff << 1) + suff + Tmp[j]; Val[i] = suff; Q[pref].push_back(i); } int k3 = 1; for (int i = 0; i < k; i ++) k3 *= 3; for (int state = 0; state < k3; state ++) { int tmp = state; for (int j = 0; j < k; j ++) Tmp[j] = tmp % 3, tmp /= 3; int h = -1; for (int j = 0; j < k; j ++) if (Tmp[j] == 2) h = j; if (h == -1) { for (int j = 0; j < k; j ++) B[state] |= Tmp[j] << j; continue; } B[state] = -1; Tmp[h] = 0; for (int j = k - 1; ~ j; j --) L[state] = L[state] * 3 + Tmp[j]; Tmp[h] = 1; for (int j = k - 1; ~ j; j --) R[state] = R[state] * 3 + Tmp[j]; } for (int mask = 0; mask < (1 << m); mask ++) { for (int state = 0; state < k3; state ++) { if (B[state] != -1) dp[state] = A[(mask << k) | B[state]]; else dp[state] = dp[L[state]] + dp[R[state]]; } for (int sk = 0; sk < (1 << m); sk ++) { for (int j = 0; j < m; j ++) { if (sk >> j & 1) Tmp[j] = 2; else Tmp[j] = mask >> j & 1; } int pref = 0; for (int j = m - 1; ~ j; j --) pref = pref * 3 + Tmp[j]; for (int i : Q[pref]) RS[i] += dp[Val[i]]; } } for (int i = 0; i < q; i ++) printf("%d\n", RS[i]); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

snake_escaping.cpp: In function 'int main()':
snake_escaping.cpp:13:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%s", &n, &q, A);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~
snake_escaping.cpp:19:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%s", Tmp);
         ~~~~~^~~~~~~~~~~
#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...