Submission #399145

#TimeUsernameProblemLanguageResultExecution timeMemory
399145AugustinasJucasLinear Garden (IOI08_linear_garden)C++14
100 / 100
431 ms3324 KiB
#include <bits/stdc++.h>

using namespace std;
long long n, m;
const int dydis = 9e5 +  1 ;
int dp[4][2][3][3] = {0};
string a;
int f(int ind, bool jauTikraiMaz, int buvo, int paskutinisDvig){
    if(ind == n) return dp[ind&1][jauTikraiMaz][buvo][paskutinisDvig] = 1;
    if(dp[ind & 1][jauTikraiMaz][buvo][paskutinisDvig] != -1) return dp[ind & 1][jauTikraiMaz][buvo][paskutinisDvig];

    /// jei desiu 1
    int st = 0;
    if((a[ind] == '0' && jauTikraiMaz) || a[ind] == '1'){
        int bsJau = jauTikraiMaz;
        if(buvo != 1 + 1){
            // nebus du is eiles
            st = st + f(ind+1, bsJau, 1+1, paskutinisDvig); st %= m;
        }else{
            // bus du is eiles
            if(paskutinisDvig != 1+1){
                // jei pries tai nedejau dvigubu vienetu
                st = st + f(ind+1, bsJau, 1+1, 1+1); st %= m;
            }
        }
    }
    /// jei desiu 0
    int bsJau = jauTikraiMaz || (a[ind] == '1');
    if(buvo != 0 + 1){
        // nebus du is eiles
        st = st + f(ind+1, bsJau, 0+1, paskutinisDvig); st %= m;
    }else{
        // bus du is eiles
        if(paskutinisDvig != 0+1){
            st = st + f(ind+1, bsJau, 0+1, 0+1); st %= m;
        }
    }
    return dp[ind & 1][jauTikraiMaz][buvo][paskutinisDvig] = st;
}
int main() {
    //ofstream out ("out.txt");
    cin >> n >> m >> a;
    for(auto &x : a) if(x == 'L') x = '0'; else x = '1';
    int i, j, h, b;
    for(i = 0; i < 3; i++) for(b = 0; b < 2; b++) for(j = 0; j < 3; j++) for(h = 0; h < 3; h++) dp[i][b][j][h] = -1;
    //cout << "Viso yra " << dp[1][0][0] + dp[1][0][1];
    for(int i = n-1; i > -1; i--){
        for(int b = 0; b < 2; b++){
            for(int h = 0; h < 3; h++){
                for(int l = 0; l < 3; l++){
                    dp[i&1][b][h][l] = -1;
                    f(i, b, h, l);
                }
            }
        }
    }
    cout << f(0, 0, 0, 0);
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...