Submission #1126373

#TimeUsernameProblemLanguageResultExecution timeMemory
1126373AverageAmogusEnjoyerMiners (IOI07_miners)C++20
100 / 100
818 ms100948 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include <bits/stdc++.h> using namespace std; using ll = long long; template<class T> bool cmin(T &i, T j) { return i > j ? i=j,true:false; } template<class T> bool cmax(T &i, T j) { return i < j ? i=j,true:false; } mt19937 mrand(chrono::steady_clock::now().time_since_epoch().count()); uniform_int_distribution<int> ui(0, 1 << 30); int rng() { return ui(mrand); } struct state { int a[3][2]; bool operator==(const state &e) { for (int i=0;i<3;i++) for (int j=0;j<2;j++) if (a[i][j]!=e.a[i][j]) return 0; return 1; } }; state shift(state &p,int w,int n) { state res = p; res.a[0][w]=res.a[1][w]; res.a[1][w]=res.a[2][w]; res.a[2][w]=n; return res; } int eval(state &s,int w) { int mask = 0; for (int i=0;i<3;i++) mask |= 1 << s.a[i][w]; int ans = 0; for (int i=1;i<=3;i++) ans += (mask >> i) & 1; return ans; } const int N=100100; const int K=8; int dp[N][1 << K]; int get_bit(int v,int k) { return (v >> k) & 1; } int eval(int v,int k,int n) { // cout << bitset<8>(v) << " and " << k << " becomes "; if (k) v = v >> 4; // cout << bitset<4>(v) << endl; int mask = (1 << (get_bit(v,0) + 2 * get_bit(v,1))) | (1 << (get_bit(v,2) + 2 * get_bit(v,3))) | (1 << n); return get_bit(mask,1) + get_bit(mask,2) + get_bit(mask,3); } int bts[8]; int insert(int v,int k,int n) { for (int i=0;i<8;i++) bts[i]=get_bit(v,i); if (k) { bts[4]=bts[6],bts[5]=bts[7],bts[6]=get_bit(n,0),bts[7]=get_bit(n,1); int res=0; for (int i=0;i<8;i++) res|=bts[i]*(1<<i); return res; } else { bts[4-4]=bts[6-4],bts[5-4]=bts[7-4],bts[6-4]=get_bit(n,0),bts[7-4]=get_bit(n,1); int res=0; for (int i=0;i<8;i++) res|=bts[i]*(1<<i); return res; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; string s; cin >> s; s = "#" + s; string wrs="BFM"; memset(dp,0xc0,sizeof(dp)); dp[0][0]=0; for (int i=1;i<=n;i++) { int v = find(wrs.begin(),wrs.end(),s[i])-wrs.begin() + 1; for (int prev_state=0;prev_state<(1<<K);prev_state++) { for (int k=0;k<2;k++) { auto new_state = insert(prev_state,k,v); // cout << bitset<8>(prev_state) << " " << k << " " << v << " " << bitset<8>(new_state) << " " << eval(prev_state,k,v) << endl; cmax(dp[i][new_state],dp[i-1][prev_state] + eval(prev_state,k,v)); } } } int ans=0; for (int i=0;i<(1<<K);i++) cmax(ans,dp[n][i]); cout << ans << 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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...