| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 986008 | andrei_boaca | Lamps (JOI19_lamps) | C++17 | 146 ms | 71156 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
vector<int> state[105];
int dp[1000005][17];
vector<int> t[2][2];
int cost[17][17];
int cnt;
string A;
string B;
int n;
int getval(vector<int> ord,int me)
{
    for(int i:ord)
    {
        if(i==0)
            me=0;
        if(i==1)
            me=1;
        if(i==2)
            me=1-me;
    }
    return me;
}
int mypoz[7];
int getcost(vector<int> a,vector<int> b)
{
    swap(a,b);
    int ans=a.size();
    for(int i=0;i<3;i++)
        mypoz[i]=-1;
    for(int i=0;i<b.size();i++)
        mypoz[b[i]]=i;
    int lg=a.size();
    for(int mask=0;mask<(1<<lg);mask++)
    {
        vector<int> sub;
        for(int i=0;i<lg;i++)
            if((mask>>i)&1)
                sub.push_back(a[i]);
        int cur=-1;
        bool ok=1;
        for(int i:sub)
        {
            if(mypoz[i]==-1||mypoz[i]<cur)
            {
                ok=0;
                break;
            }
            cur=mypoz[i];
        }
        if(ok)
            ans=min(ans,(int)a.size()-(int)sub.size());
    }
    return ans;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    cin>>A>>B;
    A="0"+A;
    B="0"+B;
    for(int mask=0;mask<(1<<3);mask++)
    {
        vector<int> me;
        for(int i=0;i<=2;i++)
            if((mask>>i)&1)
                me.push_back(i);
        do
        {
            cnt++;
            state[cnt]=me;
        }while(next_permutation(me.begin(),me.end()));
    }
    for(int i=1;i<=cnt;i++)
        for(int j=0;j<=1;j++)
        {
            int val=getval(state[i],j);
            t[j][val].push_back(i);
        }
    for(int i=1;i<=cnt;i++)
        for(int j=1;j<=cnt;j++)
        {
            cost[i][j]=getcost(state[i],state[j]);
        }
    for(int i=1;i<=16;i++)
        dp[0][i]=2e6;
    dp[0][1]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=16;j++)
            dp[i][j]=2e6;
        for(int j:t[A[i]-'0'][B[i]-'0'])
            for(int k:t[A[i-1]-'0'][B[i-1]-'0'])
                dp[i][j]=min(dp[i][j],dp[i-1][k]+cost[k][j]);
    }
    int ans=2e6;
    for(int i=1;i<=16;i++)
        ans=min(ans,dp[n][i]);
    cout<<ans;
    return 0;
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
