【pat】1003 我要通过!

分析
1.只能包含P、A、T
2.xPATx — x或空或A的字符串
所以以下情况是合理的:PAT AAPATAA AAAPATAAA
3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
以此类推…
PAT正确 — PAAT正确 — PAAAT正确…
AAPATAA正确 — AAPAATAAAA正确 – AAPAAATAAAAAA正确…
AAAPATAAA正确 — AAAPAATAAAAAA正确 — AAAPAAATAAAAAAAAA正确…

此题我试过很多种限制,最后冲浪解锁出的结论是…
(left)P(mid)T(right) (left、mid、right为左边、中间、右边A的个数),必须满足:
1.中间必须有A —— mid >= 1
2.右边A的个数 = 左边A的个数*中间A的个数 —— right = left * mid(想不到这竟是道找规律的题目smile:))
3.因为b,c,x要么为空,要么为A的字符串,所以left、right != 1——简化为left != 1

#include<iostream>
#include<string>
using namespace std;

int main(){
	int n,i,j,len;
	string str;
	int left, mid, right; //左边、中间、右边的A的个数
	cin >> n;
	while(n--){
		int flag = 0;
		cin >> str;
		len = str.size();
		for(i=0;i<len;i++){
			if(str[i]!='P'&&str[i]!='A'&&str[i]!='T'){
				flag = 1;
			}
			if(str[i] == 'P')
			{
				left = i;
			}
			if(str[i] == 'T'){
				mid = i-left-1;
			}
		}
		right = len - left - mid -2;
		//cout << left << mid << right << endl;
		if( mid >= 1 && right == left*mid && left !=1 ){
			flag = 0;
		}else{
			flag = 1;
		}

		if(flag == 1){
			cout << "NO" << endl;
		}else{
			cout << "YES" << endl;
		}
	}
	
}
原文地址:https://www.cnblogs.com/tanghm/p/12863237.html