Submission #796786

#TimeUsernameProblemLanguageResultExecution timeMemory
796786vjudge1Lamps (JOI19_lamps)C++14
100 / 100
65 ms25992 KiB
#include<bits/stdc++.h>
using namespace std ;
const int N = 1e6 ;
int n, dp[N + 1][3][2], ans = 1e9 ;
char a[N + 1], b[N + 1] ;
int main()
{
    ios_base::sync_with_stdio( 0 ) ;
    cin.tie( 0 ) ;
    cout.tie( 0 ) ;
    cin >> n ;
    for(int i = 1 ; i <= n ; i++)
        cin >> a[i] ;
    for(int i = 1 ; i <= n ; i++)
        cin >> b[i] ;
    for(int i = 0 ; i <= N ; i++)
        for(int j = 0 ; j < 3 ; j++)
            for(int q = 0 ; q < 2 ; q++)
                dp[i][j][q] = 1e9 ;
    dp[0][0][0] = 0 ;
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = 0 ; j < 3 ; j++)
            for(int q = 0 ; q < 2 ; q++)
                dp[i][0][0] = min(dp[i][0][0], dp[i - 1][j][q]) ;
        dp[i][0][1] = min({dp[i - 1][1][0] + 1, dp[i - 1][2][0] + 1, dp[i - 1][1][1], dp[i - 1][2][1], dp[i - 1][0][0] + 1, dp[i - 1][0][1]}) ;
        dp[i][1][0] = min({dp[i - 1][1][0], dp[i - 1][2][0] + 1, dp[i - 1][0][0] + 1, dp[i - 1][1][1], dp[i - 1][2][1] + 1, dp[i - 1][0][1] + 1}) ;
        dp[i][2][0] = min({dp[i - 1][2][0], dp[i - 1][1][0] + 1, dp[i - 1][0][0] + 1, dp[i - 1][2][1], dp[i - 1][1][1] + 1, dp[i - 1][0][1] + 1}) ;
        dp[i][1][1] = min({dp[i - 1][2][0] + 2, dp[i - 1][1][0] + 1, dp[i - 1][0][0] + 2, dp[i - 1][2][1] + 1, dp[i - 1][1][1], dp[i - 1][0][1] + 1}) ;
        dp[i][2][1] = min({dp[i - 1][1][0] + 2, dp[i - 1][2][0] + 1, dp[i - 1][0][0] + 2, dp[i - 1][1][1] + 1, dp[i - 1][2][1], dp[i - 1][0][1] + 1}) ;
        for(int j = 0 ; j < 3 ; j++)
            for(int q = 0 ; q < 2 ; q++)
            {
                int num = (a[i] - '0') ;
                if(j == 1)num = 1 ;
                if(j == 2)num = 0 ;
                if(q == 1)num ^= 1 ;
                if(num != b[i] - '0')
                    dp[i][j][q] = 1e9 ;
            }
    }
    for(int j = 0 ; j < 3 ; j++)
        for(int q = 0 ; q < 2 ; q++)
            ans = min(ans, dp[n][j][q]) ;
    cout << ans ;
    return 0 ;
}
//dp[i][j][q]
//j = 0 есди сейчас мы не пользовались первым или вторым видом операций
//j = 1 если сейчас мы сделали на каком то отрезке присваение числу 1
//j = 2 если сейчас мы сделали на каком то отрезке присваение числу 0
//q = 0 если сейчас мы не делаем xor на отрезке в данный момент
//q = 1 если сейчас мы делаем xor на отрезке в данный момент
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...