Submission #1059266

#TimeUsernameProblemLanguageResultExecution timeMemory
1059266oscar1fLamps (JOI19_lamps)C++17
100 / 100
496 ms18256 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long

const int TAILLE_MAX=1000*1000+5,INFINI=1000*1000*1000;
int taille;
char carac;
int init[TAILLE_MAX],obj[TAILLE_MAX];
int memo[2][2][3][2];

int calcTransi(int xorSous,int milieu,int xorSur,int nouvSous,int nouvMil,int nouvSur) {
    int ans=0;
    if (xorSous==0 and nouvSous==1) {
        ans++;
    }
    if (milieu!=nouvMil and nouvMil!=2) {
        ans++;
    }
    if (xorSur==0 and nouvSur==1) {
        ans++;
    }
    return ans;
}

int calcVal(int val,int xorSous,int milieu,int xorSur) {
    val^=xorSous;
    if (milieu!=2) {
        val=milieu;
    }
    val^=xorSur;
    return val;
}

int dyna(int pos,int xorSous,int milieu,int xorSur) {
    if (pos==taille) {
        return 0;
    }
    int ans=memo[pos][xorSous][milieu][xorSur];
    if (ans!=INFINI) {
        return ans;
    }
    int coutTransi;
    for (int j=0;j<2;j++) {
        for (int k=0;k<3;k++) {
            for (int l=0;l<2;l++) {
                if (milieu!=k or milieu==2) {
                    coutTransi=min(calcTransi(xorSous,milieu,xorSur,j,k,l),calcTransi(xorSur,milieu,xorSous,j,k,l));
                }
                else {
                    coutTransi=calcTransi(xorSous,milieu,xorSur,j,k,l);
                }
                if (calcVal(init[pos],j,k,l)==obj[pos]) {
                    ans=min(ans,coutTransi+dyna(pos+1,j,k,l));
                }
            }
        }
    }
    memo[pos][xorSous][milieu][xorSur]=ans;
    return ans;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>taille;
    for (int i=0;i<taille;i++) {
        cin>>carac;
        if (carac=='1') {
            init[i]=1;
        }
    }
    for (int i=0;i<taille;i++) {
        cin>>carac;
        if (carac=='1') {
            obj[i]=1;
        }
    }
    for (int j=0;j<2;j++) {
        for (int k=0;k<3;k++) {
            for (int l=0;l<2;l++) {
                memo[taille%2][j][k][l]=0;
            }
        }
    }
    int ans,coutTransi;
    for (int pos=taille-1;pos>=0;pos--) {
        for (int xorSous=0;xorSous<2;xorSous++) {
            for (int milieu=0;milieu<3;milieu++) {
                for (int xorSur=0;xorSur<2;xorSur++) {
                    ans=INFINI;
                    for (int j=0;j<2;j++) {
                        for (int k=0;k<3;k++) {
                            for (int l=0;l<2;l++) {
                                if (milieu!=k or milieu==2) {
                                    coutTransi=min(calcTransi(xorSous,milieu,xorSur,j,k,l),calcTransi(xorSur,milieu,xorSous,j,k,l));
                                }
                                else {
                                    coutTransi=calcTransi(xorSous,milieu,xorSur,j,k,l);
                                }
                                if (calcVal(init[pos],j,k,l)==obj[pos]) {
                                    ans=min(ans,coutTransi+memo[(pos+1)%2][j][k][l]);
                                }
                            }
                        }
                    }
                    memo[pos%2][xorSous][milieu][xorSur]=ans;
                }
            }
        }
    }
    cout<<memo[0][0][2][0]<<endl;
    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...