1003 我要通过! (20 分)
题目链接
算法分析
注意以下几点:
1.P,A,T三个字母必须都出现过,用on数组来记录。
2.只能有一个P和一个T出现,用on数组来记录
3.用jl数组记录被P和T分成三段的字符串中,A的个数
4.按照要求特判就好了
代码实现
#include<bits/stdc++.h>
using namespace std;
int on[5];
int jl[5];
int main(){
int n;
string a;
scanf("%d", &n);
for(int i = 1;i <= n; ++ i){
cin>> a;
for(int i = 1; i <= 3; ++ i){
jl[i] = 0;
on[i] = 0;
}
int len = a.size();
int t = 0;
int T = 0;
int judge = 0;
int p1 = 0, p2 = 0;
for(int i = 0; i < len; ++ i){
if(a[i] == 'P'){
if(on[1] == 1){
puts("NO");
judge = 1;
break;
}
p1 = i;
on[1] = 1;
jl[++ T] = t;
t = 0;
}
if(a[i] == 'A'){
on[2] = 1;
++ t;
}
if(a[i] == 'T'){
if(on[3] == 1){
puts("NO");
judge = 1;
break;
}
p2 = i;
on[3] = 1;
jl[++ T] = t;
t = 0;
}
if( (a[i] != 'P') && (a[i] != 'A') && (a[i] != 'T') ){
puts("NO");
judge = 1;
break;
}
}
if(judge == 1) continue;
jl[++ T] = t;
for(int i = 1; i <= 3; ++ i)
if(on[i] == 0){
puts("NO");
judge = 1;
break;
}
if(judge == 1) continue;
if(jl[2] == 0 || p1 > p2){
puts("NO");
continue;
}
if(jl[3] == jl[1] * jl[2]) puts("YES");
else puts("NO");
}
return 0;
}