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>
#define jizz ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pb push_back
#define ET cout << "\n"
#define MEM(i,j) memset(i,j,sizeof i)
#define F first
#define S second
#define MP make_pair
#define ALL(v) v.begin(),v.end()
#define DB(a,s,e) {for(int i=s;i<e;++i) cout << a[i] << " ";ET;}
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
int MOD;
int PP[3][1000005],PL[3][1000005]; 
string s;
void calPL(int n)
{
	for(int i=2;i<=n;++i)
	{
		PL[0][i]=PL[2][i]=PL[1][i]=0;
		if(i&1) PL[0][i]=1;
		PL[0][i]=(PL[0][i]+PL[1][i-1])%MOD;
		PL[1][i]=(PL[0][i-1]+PL[2][i-1])%MOD;
		PL[2][i]=(PL[2][i]+PL[1][i-1])%MOD;
	}
}
void calPP(int n)
{
	for(int i=2;i<=n;++i)
	{
		PP[0][i]=PP[2][i]=PP[1][i]=0;
		if(i&1^1) PP[2][i]=1;
		PP[0][i]=(PP[0][i]+PP[1][i-1])%MOD;
		PP[1][i]=(PP[0][i-1]+PP[2][i-1])%MOD;
		PP[2][i]=(PP[2][i]+PP[1][i-1])%MOD;
	}
}
int range(int x,int n)
{
	if(x==2)
		return (PP[0][n]+PP[1][n]+PP[2][n])%MOD;
	else
		return (PL[0][n]+PL[1][n]+PL[2][n])%MOD;
}
int main()
{jizz
	int n,ans=0,rv=0,flag=0,all,nw;
	cin >> n >> MOD >> s;
	if(n==1)
		if(s=="L") cout << "1\n";
		else cout << "2\n";
	else if(n==2)
		if(s=="LL") cout << "1\n";
		else if(s=="LP") cout << "2\n";
		else if(s=="PL") cout << "3\n";
		else cout << "4\n";
	else
	{
		if(s[0]=='L') 
		{
			rv=1;
			for(auto &c:s)
				if(c=='L') c='P';
				else c='L';
		}
		calPP(n),calPL(n);
		ans=(range(1,n)+range(2,n)+1)%MOD;
		all=ans*2%MOD;
		nw=1;
		for(int i=1;i<n;++i)
		{
			if(!flag)
				if(i&1)
					if(s[i]=='L');
					else
						flag=1,ans=(ans+range(1,n-i)+range(2,n-i)+1)%MOD;
				else
					if(s[i]=='L') flag=-1;
					else
						ans=(ans+range(1,n-i)+1)%MOD;
			else if(s[i]=='P')
				if(nw==1)
					if(flag==1)
						ans=(ans+range(1,n-i)+1)%MOD;
					else
						ans=(ans+range(2,n-i)+1)%MOD;
				else if(nw==0)
					if(flag==-1)
						ans=(ans+range(1,n-i)+1)%MOD;
			if(s[i]=='P') ++nw;
			else --nw;
		}
		if(rv) cout << (all-ans+MOD)%MOD << "\n";
		else cout << (ans+1)%MOD << "\n";
	}
}
Compilation message (stderr)
linear_garden.cpp: In function 'void calPP(int)':
linear_garden.cpp:37:7: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
   if(i&1^1) PP[2][i]=1;
      ~^~
linear_garden.cpp: In function 'int main()':
linear_garden.cpp:88:11: warning: suggest explicit braces to avoid ambiguous 'else' [-Wdangling-else]
    else if(s[i]=='P')
           ^| # | 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... | 
| # | 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... | 
| # | 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... | 
| # | 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... | 
| # | 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... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |