样例全过,只对了第一个点求助
#include<bits/stdc++.h>
#define int long long
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x])
using namespace std;
const int N=1e6+10;
int n,p,ans,rev,ver;
int a[N];
bool col[N];
char c;
int fr(){
int x=0,flag=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
return x*flag;
}
void fw(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) fw(x/10);
putchar(x%10+'0');
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int qkm(int a,int k)
{
int ans=0,base=a;
while(k)
{
if(k&1) (ans+=base)%=p;
(base+=base)%=p;
k>>=1;
}
return ans;
}
signed main()
{
n=fr(),p=fr();
for(int i=1;i<=n;i++) a[i]=fr()%p;
for(int i=1;i<=n;i++)
{
cin>>c;
col[i]=(c=='G');
}
//rev 序列是否翻转 ver 颜色是否翻转
//P 0 G 1
int cnt=0,l=1,r=n;
while(l<r)
{
cnt++;
if(rev)
{
(ans+=a[r])%=p;
int c1=col[r]^ver,c2=col[r-1]^ver;
if(c1==c2) a[r-1]=qkm(a[r-1],a[r]);
else if(!c1 && c2 && cnt&1) ver^=1;
else rev^=1,ver^=1;
r--;
}
else
{
(ans+=a[l])%=p;
int c1=col[l]^ver,c2=col[l+1]^ver;
if(c1==c2) a[l+1]=qkm(a[l+1],a[l]);
else if(!c1 && c2 && cnt&1) ver^=1;
else rev^=1,ver^=1;
l++;
}
}
(ans+=a[l])%=p;
fw(ans);
return 0;
}