看起来很简单地模拟,试试:
int l=1,r=n;
for(int i=0;i<s.length();i++){
int temp=1;
for(int j=r;j>=l;j--){
//kn[j]%=m;
temp=(temp*kn[j])%m;
//cout<<kn[j]<<" ";
}
//cout<<endl;
cout<<temp%m<<" ";
if(s[i]=='L')l++;
else if(s[i]=='R')r--;
}
很好,错了,为什么错?两点:
1.wrong answer in 3 看我注释掉的第一个,只能整体乘积取余,不能只对某个数取余,因为数据很大。
2.TLE in 4 顺序不可以,复杂度n方了——应该逆序+记录,删除——>增添。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int kn[N];
int a[N];
int ans[N];
signed main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>kn[i];
string s;
cin>>s;
int l=1,r=n,k=0;
for(int i=0;i<s.length();i++){//记录依次被拔除
if(s[i]=='L')a[++k]=kn[l++];
else a[++k]=kn[r--];
}
memset(ans,1,sizeof ans);
int temp=1;
for(int i=k;i>=1;i--){ //倒序记录答案
temp=temp*a[i]%m;
ans[i]=temp;
}
for(int i=1;i<=k;i++)cout<<ans[i]<<" ";
cout<<endl;
}
return 0;
}