Submission #340551

#TimeUsernameProblemLanguageResultExecution timeMemory
340551couplefireSnake Escaping (JOI18_snake_escaping)C++17
100 / 100
1900 ms55684 KiB
#include <bits/stdc++.h> using namespace std; #define MAXN 1594323 int len, q; int dp[MAXN]; string s; int ans[MAXN]; int pw[21]; int lowbit[MAXN]; int mp[MAXN]; int counter; bool isSub[2187][128]; int p1[MAXN], p2[MAXN]; int main(){ // freopen("a.in", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(0); cin >> len >> q >> s; for(int i = 0; i<2187; i++){ for(int j = 0; j<128; j++){ isSub[i][j] = 1; int c1 = i, c2 = j; for(int k = 0; k < 7; k++){ if((c1%3 != 2 && c2%2 != c1%3)) isSub[i][j] = 0; c1 /= 3, c2 /= 2; } } } pw[0] = 1; for(int i = 1; i<=20; i++) pw[i] = pw[i-1]*3; lowbit[0] = lowbit[1] = MAXN; for(int i = 2; i<MAXN; i++){ if(i%3 == 2) lowbit[i] = 0; else lowbit[i] = lowbit[i/3]+1; } for(int i = 0; i<MAXN; i++){ if(lowbit[i] >= MAXN) mp[counter++] = i; } for(int i = 0; i<q; i++){ string ss; cin >> ss; reverse(ss.begin(), ss.end()); int cur2 = 0; for(int j = 0; j<min(7, len); j++){ if(ss[j] == '?') cur2 += pw[j]*2; else cur2 += pw[j]*(ss[j]-'0'); } p2[i] = cur2; int cur1 = 0; for(int j = 7; j<len; j++){ if(ss[j] == '?') cur1 += pw[j-7]*2; else cur1 += pw[j-7]*(ss[j]-'0'); } p1[i] = cur1; } // for(int i = 0; i<100; i++) cout << lowbit[i] << " "; // cout << endl; for(int i = 0; i < min(128, (int)s.length()); i++){ memset(dp, 0, sizeof dp); for(int j = 0, end = (1<<(max(len-7, 0))); j<end; j++) dp[mp[j]] = s[(j<<7)+i]-'0'; for(int j = 0; j<((len >= 7) ? pw[len-7] : 1); j++){ if(lowbit[j] < MAXN) dp[j] = dp[j-pw[lowbit[j]]]+dp[j-pw[lowbit[j]]*2]; } for(int j = 0; j<q; j++){ if(isSub[p2[j]][i]) ans[j] += dp[p1[j]]; } } for(int i = 0; i<q; i++) cout << ans[i] << " "; cout << endl; }
#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...