alt alt alt alt

-------------------以下是主题部分-------------------------------------

  1. 对于此题,我们可以发现s在第一个位置和p在最后一个位置对排列不会产生影响。除此之外,如果字符串中间有s和p同时出现,那么不论位置如何变化,都不能满足条件。
  2. 那么我们把开头的s和最后的p替换为'.',再去找s和p出现的次数,如果同时都大于0,那么我们不能构造出数列。

------------------以下是代码部分----------------------------------------


using namespace std;

int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		string s;
		cin>>s;
		if(s[0]=='s') s[0]='.';
		if(s[n-1]=='p') s[n-1]='.';
		int ts=0,tp=0;
		for(int i=0;i<=n-1;i++){
			if(s[i]=='s') ts++;
			if(s[i]=='p') tp++;
		}
		if(ts&&tp) cout<<"NO"<<endl;
		else cout<<"YES"<<endl;
	}
	return 0;
}

---------以下是反思部分-----------------------------

  1. 做题时发现队首s和队尾p的特殊性,但并未做特殊处理。也没有发现除了首尾位置之外s和p不能同时出现,而是猜测s不能出现在p的右边,导致答案出错。
  2. 做题时还去特判了全是'.'的情况,其实对于不影响的元素不必判断,只需要找到s,p数量的特殊性即可。