计划从左到右和从右到左扫两遍,但是没过
#include <iostream>
#include <vector>
#define int long long
using namespace std;
char c[100005];
vector<int> ren,bj;
int n,id,l=0,r=2e9;
bool check(int x){
int cur=ren[0],pt=0;
/*if(ren[0]>bj[0])cur=ren[0]+x-2*(ren[0]-bj[0]);
else cur=ren[0]+x;*/
for(int i=0;i<ren.size();i++){
if(ren[i]>bj[pt]){
if(ren[i]-bj[pt]>x)break;
cur=max(ren[i],ren[i]+x-2*(ren[i]-bj[pt]));
}
else cur=ren[i]+x;
while(cur>=bj[pt]&&pt<bj.size())pt++;//这个人吃掉的包装
}
if(pt==bj.size())return true;
cur=ren[ren.size()-1],pt=bj.size()-1;
for(int i=ren.size()-1;i>=0;i--){
if(ren[i]<bj[pt]){
if(bj[pt]-ren[i]>x)break;
cur=min(ren[i],ren[i]-x+2*(bj[pt]-ren[i]));
}
else cur=ren[i]-x;
while(cur<=bj[pt]&&pt>=0)pt--;//这个人吃掉的包装
}
if(pt==-1)return true;
return false;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>c[i];
if(c[i]=='P')ren.push_back(i);
if(c[i]=='*')bj.push_back(i);
}
while(l<r){
//cout<<54188<<endl;
int mid=l+(r-l)/2;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}