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