题目
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);
}
}