Submission #447946

#TimeUsernameProblemLanguageResultExecution timeMemory
447946blueLinear Garden (IOI08_linear_garden)C++17
100 / 100
39 ms6248 KiB
#include <iostream>
#include <string>
using namespace std;

int N, M;
int pow2[1000001];

int main()
{
    cin >> N >> M;
    string S;
    cin >> S;

    pow2[0] = 1;
    for(int i = 1; i <= 1e6; i++) pow2[i] = (2 * pow2[i-1]) % M;

    int res = 0;
    int last_block = -1; //left position of block
    for(int i = 0; i < N; i++)
    {
        if(S[i] == 'L')
        {
            if(i > 0 && S[i] == S[i-1]) last_block = i-1;
            continue;
        }
        int x = N-i;
        int k = x/2;

        if(last_block == -1)
        {
            if(x % 2)
            {
                if(i == 0) res = (res + pow2[k] + pow2[k] - 1) % M;
                else if(S[i-1] == 'L')
                {
                    res = (res + pow2[k]) % M;
                }
                else if(S[i-1] == 'P')
                {
                    res = (res + pow2[k] + pow2[k] - 1) % M;
                }
            }
            else
            {
                if(i == 0) res = (res + pow2[k] + pow2[k-1] - 1) % M;
                else if(S[i-1] == 'L')
                {
                    res = (res + pow2[k-1]) % M;
                }
                else if(S[i-1] == 'P')
                {
                    res = (res + pow2[k] + pow2[k-1] - 1) % M;
                }
            }

        }
        else if(S[last_block] == 'L' && last_block % 2 == i % 2 && x % 2 == 0)
        {
            continue;
        }
        else if(S[last_block] == 'L' && last_block % 2 == i % 2 && x % 2 == 1)
        {
            continue;
        }
        else if(S[last_block] == 'L' && last_block % 2 != i % 2 && x % 2 == 0)
        {
            res = (res + pow2[k-1]) % M;
        }
        else if(S[last_block] == 'L' && last_block % 2 != i % 2 && x % 2 == 1)
        {
            res = (res + pow2[k]) % M;
        }
        else if(S[last_block] == 'P' && last_block % 2 == i % 2 && x % 2 == 0)
        {
            continue;
        }
        else if(S[last_block] == 'P' && last_block % 2 == i % 2 && x % 2 == 1)
        {
            continue;
        }
        else if(S[last_block] == 'P' && last_block % 2 != i % 2 && x % 2 == 0)
        {
            res = (res + pow2[k-1]) % M;
        }
        else /*if(S[last_block] == 'P' && last_block % 2 != i % 2 && x % 2 == 1)*/
        {
            res = (res + pow2[k]) % M;
        }
        if(i > 0 && S[i] == S[i-1]) last_block = i-1;

    }
    res = (res + 1) % M;
    cout << res << '\n';
}
#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...