トピック分析:
かなり無力この質問、困難であるだけで状況はテストケースへの最後の対象とすることを後で述べ間違っWAを、持って理解し、私はイタリアに間違って戻っていたことを認識し始めて、シンプルで簡単なことを言うのは難しいです。この質問の解決の鍵となるのは、実際には、表現したいタイトルの意味を理解し、少しテスト読解慎重な考えを感じることがあります。
トピックは、第2および第3の条件を理解する方法に焦点を当てています。
- 第二の条件のために注目すべきである:Xは文字列であり、xPATxので、それはPAT列の左右両側には、次に、すなわち、そこにはあり、または文字列Aから構成され、同一の、または空の文字列であってはならないことを意味長さが外部に等しくないかどうかを決定することに加えて、それは決意を必要とされています。
- 第三の条件については、だけでなく、より洗練された外観。aPbTcが正しければ、あなたも正しいaPbATcaの配信を起動し続けることができ、それは、この漸化式の開始点を決定することが重要である、と少し考えたが、この状況が出発点xPATxであることを理解することができるようになります、それは二つの条件の場合が出会うです。したがって、コンプライアンスを決定する第3の方法は、実際に第二の条件に基づい由来する基づいて満たされます。各再帰的には、マルチマルチTストリングストリングの要件に対応する、P及びA Tの間に挿入されます。
とともに
、A、B、Cの文字列を表します
左側に示す列P、およびT P、Tの間の文字列の後に文字列、次に方程式が得られます。
及び初期条件を必要とします
そう
これは、次のコード(既にAC)を用いて実施することができます
ソース
#include <stdio.h>
bool isPAT(int *ch,int len);
int main()
{
int caseNumber;
scanf("%d",&caseNumber);
getchar();
while(caseNumber--){
int ch[100];
int count=0;
while((ch[count++]=getchar())!=EOF&&ch[count-1]!=10) //读取字符,10对应换行符
;
if(isPAT(ch,count-1)) printf("YES\n");
else printf("NO\n");
}
return 0;
}
bool isPAT(int *ch,int len)
{
int i=0;
int left=0,mid=0,right=0; //分别记录P前遇到,P与T之间以及T之后的A个数
int symP=(int)'P',symA=(int)'A',symT=(int)'T';
while(ch[i]!=symP){ //循环 直到遇到P
if(ch[i]!=symA) return false;
if(i++>len-4) return false; //倒数第三个字符还未遇到P,不能产生PAT
left++; //对P左边的A个数计数
}
if(ch[++i]!=symA) return false; //P之后不是A,返回错误
mid++;
while(ch[++i]!=symT){
if(ch[i]!=symA) return false;
if(i>len-2) return false; //数组末尾还未遇到T,返回错误
mid++;
}
while(++i<len){ //若后面还有数字
if(ch[i]!=symA) return false;
right++; //对T后面的A计数
}
if(mid==1){
if(left!=right) return false; //对于xPATx型,若两端A个数不等,返回错误
}
else if(right!=mid*left) return false;
return true;
}