Submission #1083015

#TimeUsernameProblemLanguageResultExecution timeMemory
1083015steveonalexLamps (JOI19_lamps)C++17
100 / 100
190 ms5820 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define MASK(i) (1LL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() #define block_of_code if(true) ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll gcd(ll a, ll b){return __gcd(a, b);} ll lcm(ll a, ll b){return a / gcd(a, b) * b;} ll LASTBIT(ll mask){return (mask) & (-mask);} int pop_cnt(ll mask){return __builtin_popcountll(mask);} int ctz(ull mask){return __builtin_ctzll(mask);} int logOf(ull mask){return 63 - __builtin_clzll(mask);} mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);} double rngesus_d(double l, double r){ double cur = rngesus(0, MASK(60) - 1); cur /= MASK(60) - 1; return l + cur * (r - l); } template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){ for(auto item: container) out << item << separator; out << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } int n; string s1, s2; int dp[2][16]; const int INF = 1e9 + 69; int main(void){ ios::sync_with_stdio(0);cin.tie(0); cout.tie(0); clock_t start = clock(); vector<vector<int>> S; vector<int> perm(3); for(int i = 0; i<3; ++i) perm[i] = i; do{ vector<int> cur; for(int i: perm){ cur.push_back(i); S.push_back(cur); } } while(next_permutation(ALL(perm))); S.push_back({}); remove_dup(S); int kost[S.size()][S.size()]; for(int i = 0; i < (int)S.size(); ++i) for(int j = 0; j < (int)S.size(); ++j){ vector<int> s1 = S[i], s2 = S[j]; int x = s1.size(), y = s2.size(); int dp[x+1][y+1]; memset(dp, 0, sizeof dp); for(int i = 1; i<=x; ++i) for(int j = 1; j<=y; ++j){ dp[i][j] = max(dp[i-1][j], dp[i][j-1]); if (s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1] + 1; } kost[i][j] = s2.size() - dp[x][y]; } int transition[S.size()][2]; for(int i = 0; i < (int)S.size(); ++i) for(int j = 0; j <= 1; ++j){ int cur =j; for(int k: S[i]){ if (k == 0) cur ^= 1; if (k == 1) cur = 0; if (k == 2) cur = 1; } transition[i][j] = cur; } cin >> n; cin >> s1 >> s2; s1 = "0" + s1; s2 = "0" + s2; fill(dp[0], dp[1] + 16, INF); dp[0][0] = 0; for(int i = 1; i<=n; ++i){ int digit1 = s1[i] - '0', digit2 = s2[i] - '0'; for(int j = 0; j < 16; ++j) if (dp[0][j] != INF) { for(int k = 0; k < 16; ++k) if (transition[k][digit1] == digit2){ minimize(dp[1][k], dp[0][j] + kost[j][k]); } } for(int j = 0; j < 16; ++j){ // if (dp[1][j] != INF) cout << i << " " << j << " " << dp[1][j] << "\n"; dp[0][j] = dp[1][j]; dp[1][j] = INF; } } int ans = INF; for(int i = 0; i<16; ++i) minimize(ans, dp[0][i]); cout << ans << "\n"; cerr << "Time elapsed: " << clock() - start << " ms\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...