PAT B1003合格したい!(20点)

ここに画像の説明を挿入

#include <cstdio>
#include <iostream>
#include <string>

using namespace std;

int main(){
    
    
	int n;
	scanf("%d", &n);
	
	string str;
	int left, mid, right;
	int flag;
	for(int i=0; i<n; i++){
    
    
		flag = 0;
		cin >> str;
		for(int j=0; j<str.length(); j++){
    
    
			if(str[j]!='P' && str[j]!='A' && str[j]!='T'){
    
    
				printf("NO\n");
				flag = 1;
				break;
			}
		}
		if(flag){
    
    
			continue;
		}
		
		left = str.find("P");
		mid = str.find("T") - str.find("P") - 1;
		right = str.length() - str.find("T") - 1;
		
		if(mid == 1){
    
    
			if(left == right){
    
    
				printf("YES\n");
			}else{
    
    
				printf("NO\n");
			}
		}else if(mid == 0){
    
    
			printf("NO\n");
		}else{
    
    
			while(mid != 1){
    
    
				mid--;
				right -= left;
			}
			if(left == right){
    
    
				printf("YES\n");
			}else{
    
    
				printf("NO\n");
			}
		}
	}
	
	return 0;
} 

PATの話題が曖昧になっている気がします。考えすぎかもしれませんが、話題の意味がわかるまでに10分かかりました。
簡単なシミュレーションの質問です。最初に文字列を1回トラバースします。PATの3文字以外の文字がある場合は、NOを直接出力し、次の入力を開始します。
質問によると、PTの中央にAが1つしかない場合、Pの左側とTの右側のAの数は等しくなければならないことがわかります。中央にAがない場合PT、それは間違っています。
さらに厄介なのは3番目の条件です。PTの真ん中のAの数が1より大きい場合、PTの真ん中のAの数が1になるまで、この時点の質問の条件に従って前に戻ることができます。 1つ、それが正しいかどうかを判断します。

おすすめ

転載: blog.csdn.net/weixin_45964844/article/details/112169198