제출 #444552

#제출 시각아이디문제언어결과실행 시간메모리
444552rKrPaNLinear Garden (IOI08_linear_garden)C++14
75 / 100
245 ms65540 KiB
#include <iostream>
#include <string>
#include <cstring>
#include <map>

using namespace std;

typedef long long ll;
const int MAXN = 1e6 + 6;

int n, m;
string s;
map <tuple <int, int, int, int>, int> memo;
//int memo[MAXN][5][5][2];

int sum(ll a, ll b){
    return a+b >= m? a+b-m : a+b;
}

int rek(int x, int lo, int hi, int da){
    if (x >= n)return 1;
    int znj = memo[make_tuple(x, lo+2, hi+2, da)];
    if (znj != 0)return znj;
    //if (memo[x][lo+2][hi+2][da] != -1)return memo[x][lo+2][hi+2][da];

    int ret = 0;
    if (da){
        ///P
        int lo1 = min(lo+1, 1), hi1 = max(hi+1, 1);
        if (lo1 >= -2 && hi1 <= 2)
            ret = sum(ret, rek(x+1, lo1, hi1, 1));
        ///L
        int lo2 = min(lo-1, -1), hi2 = max(hi-1, -1);
        if (lo2 >= -2 && hi2 <= 2)
            ret= sum(ret, rek(x+1, lo2, hi2, 1));

        //return memo[x][lo+2][hi+2][da] = ret;
        return memo[make_tuple(x, lo+2, hi+2, da)] = ret;
    } else {
        ///P
        if (s[x] == 'P'){
            int lo1 = min(lo+1, 1), hi1 = max(hi+1, 1);
            if (lo1 >= -2 && hi1 <= 2)
                ret = sum(ret, rek(x+1, lo1, hi1, 0));
        }
        ///L
        int lo2 = min(lo-1, -1), hi2 = max(hi-1, -1);
        if (lo2 >= -2 && hi2 <= 2){
            if (s[x] == 'P')ret = sum(ret, rek(x+1, lo2, hi2, 1));
            if (s[x] == 'L')ret = sum(ret, rek(x+1, lo2, hi2, 0));
        }
        //cout << x << " |" << lo << " " << hi << " " << da << " | " << ret << "\n";
        return memo[make_tuple(x, lo+2, hi+2, da)] = ret;
        //return memo[x][lo+2][hi+2][da] = ret;
    }
}

int main (){

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> m >> s;

    //memset(memo, -1, sizeof memo);

    cout << rek(0, 0, 0, 0) << "\n";

    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...