題目
https://cometoj.com/contest/73/problem/B?problem_id=4115
解題思路
先特判是否有的情況。
然後確定最左邊,最右邊的,。
再找到以後最早出現的,
之後枚舉區間內的以及順便記錄每個向前最近的,
分別判斷5種情況就可以了。
代碼
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int T,n,qi; char c[1000005];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d\n",&n);
scanf("%s",c);
bool b1=0,b2=0,b3=0,b4=0;
for(int i=0;i<n;i++) {
if (!b1&&c[i]=='p') b1=1;
if (b1&&c[i]=='i') b2=1;
if (b2&&c[i]=='n') b3=1;
if (b3&&c[i]=='k') b4=1;
}
if (!b4) {
printf("-1\n");
continue;
}
int l=0,r=n-1,ans=-1e9,dis;
while (c[l]!='p') l++;
while (c[r]!='k') r--;
qi=l+1;
while (c[qi]!='i') qi++;
for(int i=qi;i<=r-1;i++){
if (c[i]=='i') dis=i;
if (c[i]=='n'){
ans=max(ans,max(qi-l-1,max(i-qi-1,max(r-i-1,max(dis-l-1,i-dis-1)))));
}
}
printf("%d\n",ans);
}
}