Submission #1212898

#TimeUsernameProblemLanguageResultExecution timeMemory
1212898minhpkLamps (JOI19_lamps)C++20
0 / 100
215 ms291884 KiB
#include <bits/stdc++.h> #define int long long using namespace std; string s,s1; int a; int f[1000001][8][3]; int next0[1000005]; int next1[1000005]; int dp(int i,int j,int k){ if (i>a){ return 0; } if (f[i][j][k]!=-1){ return f[i][j][k]; } f[i][j][k]=1e7; int res=1e7; if (j==1 && s1[i]=='0'){ res= min(res,dp(i+1,1,0)); }else if (s1[i]=='0'){ int add=1; if (j==7 && k==1){ add=0; } res= min(res,add+dp(i+1,1,0)); } if (s[i]==s1[i]){ res= min(res,dp(i+1,0,0)); } if (j==2 && s1[i]=='1'){ res= min(res,dp(i+1,2,0)); }else if (s1[i]=='1'){ int add=1; if (j==7 && k==2){ add=0; } res= min(res,add+dp(i+1,2,0)); } if (j==3 && s1[i]!=s[i]){ res= min(res,dp(i+1,3,0)); }else if (s1[i]!=s[i]){ int add=1; if (j==5 && s1[i-1]=='1'){ add=0; } if (j==6 && s1[i-1]=='0'){ add=0; } res= min(res,add+dp(i+1,3,0)); } if (j==5 && s1[i]=='0'){ res= min(res,dp(i+1,5,0)); }else if (j==5 && s1[i]!='0'){ res= min(res,1+dp(next1[i]+1,5,0)); }else{ res= min(res,1+(s1[i]=='1')+dp(i+1,5,0)); } if (j==6 && s1[i]=='1'){ res= min(res,dp(i+1,6,0)); }else if (j==6 && s1[i]!='1'){ res= min(res,1+dp(next0[i]+1,6,0)); }else{ res= min(res,1+(s1[i]=='0')+dp(i+1,6,0)); } if (j==7 && s1[i]!=s[i]){ res= min(res,dp(i+1,7,k)); }else if (j==7 && s1[i]==s[i]){ int add=1; int t=0; if (k==1 && s1[i]=='0'){ add=0; } if (k==2 && s1[i]=='1'){ add=0; } if (s1[i]=='0'){ t=1; }else{ t=2; } res=min(res,add+dp(i+1,7,t)); }else{ res= min(res,1+dp(i+1,7,0)); } return f[i][j][k]=res; } signed main() { // freopen("test.txt", "r", stdin); // freopen("o2.out", "w", stdout); ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> a; cin >> s >> s1; s='#'+s; s1='#'+s1; for (int i=1;i<=a;i++){ for (int j=0;j<=7;j++){ for (int k=0;k<=2;k++){ f[i][j][k]=-1; } } } for (int i=a;i>=1;){ if (s1[i]=='0'){ int base=i; while (s1[i]=='0'){ next0[i]=base; i--; } }else{ i--; } } for (int i=a;i>=1;){ if (s1[i]=='1'){ int base=i; while (s1[i]=='1'){ next1[i]=base; i--; } }else{ i--; } } cout << dp(1,0,0) << "\n"; return 0; } /* 8 01010101 10111000 8 01010101 10111000 10101010 6 110110 011101 001001 8 01010101 11000010 10101010 */ /* freopen("test.txt", "r", stdin); freopen("o2.out", "w", stdout); */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...