1003 我要通过!
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1003 我要通过!相关的知识,希望对你有一定的参考价值。
1. 总体思路是自己先写写,看看哪些字符串符合,找出规律,然后根据测试用例来矫正。
2. 用到了递推的方法,我使用countA[maxn]数组存放截至当前位置一共出现的A的个数。
3. 正确的字符串满足的条件是:P之前A的个数×P和T之间A的个数=T之后A的个数 且 PT之间A的个数不为0。要注意PT是不正确的字符串
AC代码如下
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
typedef long long LL;
const int maxn = 110;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界
const LL SUP = (1LL<<63)-1;//SUP:上确界
const double eps = 1e-5;
bool isPAT(char c){//判断一个字符是否是P、A、T中的一个
if(c=='P'||c=='A'||c=='T')return true;
else return false;
}
bool judge(char s[maxn]){
int L = strlen(s);
int countA[maxn] = {0};//截至当前元素有多少个A
int indexP = 0;
int indexT = 0;
if(s[0]=='A')countA[0] = 1;
else if(s[0]=='P'){
countA[0] = 0;
indexP = 0;
}
else return false;
for(int i=1;i<L;i++){
if(isPAT(s[i])){//PorAorT
if(s[i]=='A')countA[i] = countA[i-1]+1;//A
else{
countA[i] = countA[i-1];
if(s[i]=='P')indexP = i;//P
else indexT = i;//T
}
}
else return false;
}
//正确的字符串:P之前A的个数×P和T之间A的个数=T之后A的个数 且 PT之间A的个数不为0
bool res = (countA[indexP]*(countA[indexT]-countA[indexP])==countA[L-1]-countA[indexT])&&(countA[indexT]-countA[indexP]);
if(res)return true;
else return false;
}
int main(){
//APAAATAA怎么错了
//PAT PAAT PAAAT
//APATA APAATAA APAAATAAA
//AAPATAA AAPAATAAAA AAPAAATAAAAAA
//AAAPATAAA AAAPAATAAAAAA AAAPAAATAAAAAAAAA
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
char s[maxn];
scanf("%s",s);
if(judge(s))printf("YES\\n");
else printf("NO\\n");
}
return 0;
}
以上是关于1003 我要通过!的主要内容,如果未能解决你的问题,请参考以下文章