제출 #1163389

#제출 시각아이디문제언어결과실행 시간메모리
1163389Math4Life2020Lamps (JOI19_lamps)C++20
4 / 100
42 ms65348 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>;
const ll INF = 1e18;

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
    ll N; cin >> N;
    string A,B; cin >> A >> B;
    vector<bool> va,vb;
    va.push_back(0); vb.push_back(0);
    for (ll i=0;i<N;i++) {
        va.push_back(A[i]=='1');
        vb.push_back(B[i]=='1');
    }
    va.push_back(0); vb.push_back(0);
    vector<ll> dp0(N+2,INF);
    vector<ll> dpa(N+2,INF);
    vector<ll> dpa2(N+2,INF);
    vector<ll> dpa3(N+2,INF);
    vector<ll> dpb(N+2,INF);
    vector<ll> dpba(N+2,INF);
    vector<ll> dpba2(N+2,INF);
    vector<ll> dpba3(N+2,INF);
    dp0[0]=0;
    for (ll i=0;i<(N+1);i++) {
        bool isa = va[i]^va[i+1];
        bool isb = vb[i]^vb[i+1];
        if (!isa && !isb) {
            dp0[i+1]=dp0[i];
            dpa[i+1]=dpa[i];
            dpa2[i+1]=dpa2[i];
            dpa3[i+1]=dpa3[i];
            dpb[i+1]=dpb[i];
            dpba[i+1]=dpba[i];
            dpba2[i+1]=dpba2[i];
            dpba3[i+1]=dpba3[i];
            continue;
        }
        if (!isa && isb) {
            dp0[i+1]=dp0[i]+1;
            dpa[i+1]=dpa[i]+1;
            dpa2[i+1]=dpa2[i]+1;
            dpa3[i+1]=dpa3[i]+1;
            dpb[i+1]=min(dpb[i]+1,dp0[i]+1);
            dpba[i+1]=dpba[i]+1;
            dpba2[i+1]=dpba2[i]+1;
            dpba3[i+1]=dpba3[i]+1;
            dp0[i+1]=min(dp0[i+1],dpba2[i]-1);
            continue;
        }
        //else: isa
        dp0[i+1]=dp0[i]+1;
        dpa[i+1]=min(dp0[i]+1,dpa[i]+1);
        dpa2[i+1]=min(min(dpa[i]+1,dpa2[i]+1),dpa3[i]-1);
        dpa3[i+1]=min(dpa2[i]+1,dpa3[i]+1);
        dpb[i+1]=dpb[i]+1;
        dpba[i+1]=min(dpb[i]+1,dpba[i]+1);
        dpba2[i+1]=min(min(dpba[i]+1,dpba2[i]+1),dpba3[i]-1);
        dpba3[i+1]=min(dpba2[i]+1,dpba3[i]+1);
        dp0[i+1]=min(dp0[i+1],dpba2[i]-1);
        dp0[i+1]=min(dp0[i+1],dpa[i+1]);
        dp0[i+1]=min(dp0[i+1],dpa2[i+1]);
        dp0[i+1]=min(dp0[i+1],dpa3[i+1]);
        dp0[i+1]=min(dp0[i+1],dpb[i+1]);
        dp0[i+1]=min(dp0[i+1],dpba[i+1]);
        dp0[i+1]=min(dp0[i+1],dpba2[i+1]);
        dp0[i+1]=min(dp0[i+1],dpba3[i+1]);
        //process isb
        if (isb) {
            dp0[i+1]++;
            dpa[i+1]++;
            dpa2[i+1]++;
            dpa3[i+1]++;
            dpb[i+1]++;
            dpba[i+1]++;
            dpba2[i+1]++;
            dpba3[i+1]++;
            dp0[i+1]=min(dp0[i+1],dp0[i]);
        }
    }
    // for (ll i=0;i<(N+2);i++) {
    //     cout << "i="<<i<<"\n";
    //     cout << "dp0="<<dp0[i]<<"\n";
    //     cout << "dpa="<<dpa[i]<<"\n";
    //     cout << "dpa2="<<dpa2[i]<<"\n";
    //     cout << "dpa3="<<dpa3[i]<<"\n";
    //     cout << "dpb="<<dpb[i]<<"\n";
    //     cout << "dpba="<<dpba[i]<<"\n";
    //     cout << "dpba2="<<dpba2[i]<<"\n";
    //     cout << "dpba3="<<dpba3[i]<<"\n";
    // }
    cout << dp0[N+1]/2;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...