PAT乙級——1003


PAT乙1003
  • テーマ:私は通過します!(20分)
  • テーマ分析
  • コード実装
  • 私は合格します!(20点)
    「答えが正しい」は、自動判定システムが与える最も喜ばしい返事だ.本題はPATの「答えが正しい」大派送に属する--読み込んだ文字列が以下の条件を満たす限り、システムは「答えが正しい」を出力し、そうでなければ「答えが間違っている」を出力する.
    「正解」を得る条件は次のとおりです.
  • 文字列には、P、A、Tの3文字しか含まれていない必要があります.他の文字は含まれてはいけません.
  • xPATxのような任意の形の文字列は、xまたは空の文字列、またはアルファベットAのみからなる文字列である「答えが正しい」を得ることができる.
  • aPbTcが正しい場合、aPbATcaも正しい.ここで、a、b、cはいずれも空の文字列、またはアルファベットAのみからなる文字列である.

  • 今すぐPATのために自動審判プログラムを書いて、どの文字列が「答えが正しい」かを判定してください.
    入力形式:
    各テスト入力には、1つのテスト例が含まれます.1行目は、検出する文字列の個数である正の整数n(<10)を与える.次に、各文字列は1行で、文字列の長さは100を超えず、スペースは含まれません.
    出力フォーマット:
    各文字列の検出結果は1行を占め、その文字列が「正解」を得ることができればYESを出力し、そうでなければNOを出力する.
        :
    8
    PAT
    PAAT
    AAPATAA
    AAPAATAAAA
    xPATx
    PT
    Whatever
    APAAATAA
    
        :
    YES
    YES
    YES
    YES
    NO
    NO
    NO
    NO
    

    テーマ分析
    Emmmmm、この問題はまだ少し難しいですが、彼は一定の推理が必要で、結果を達成することができます.条件1と2から私たちは形を知っています.
      PAT
      APATA
      AAPATAA
      AAAPATAAA
    

    いずれも正しい、つまり真ん中の1つのAに左右の数を加えたAが成立する.条件3によれば、PAT−はaPbTcにとってacは空であり、bはAである.だからPAATは正しい.aPbATcaは,PAAAAATのように中に何個のAを加えても正しい.APATA--aPbTcにとってabcはAです.aPbATcaなので、APAATAAは正しいです.この時は法則を探して類推する必要がある.Aの個数を観察する必要があります.最初は、PATについて、左のAと右のAは0で、真ん中は1で、左x中=右に続くAPATAで、左中右は1で、左x中=右に続いて、APAATAAで、左1で、中2で、右2で、左x中=右( , , )
    コード実装
    ACがなくて、18分、1つの用例が通っていないで、しかし私はしばらくどこが考慮していないことを思い付かないで、もし人が発見するならば、私に教えてほしいです.
    //    ,     NO   No,           ,
    //         ,   
    import java.util.Scanner;
    public class Main
    {
        public static void main(String []args){
            //        ,P T       ,       1P2T3 , A    1*2=3
            Scanner in = new Scanner(System.in);
            int n =in.nextInt();
            String input[]=new String[n];
            String output[]=new String[n];
            for(int i =0;i<n;i++) {
                input[i] = in.next();
                int count1=0;
                int count2=0;
                int count3=0;
                int countP=0;
                int countT=0;
                int mark =0;
                char temp[] = input[i].toCharArray();
                for (int k = 0; k < temp.length; k++) {
                    mark++;//             ,    
                    if(temp[k]!='P'&&temp[k]!='A'&&temp[k]!='T'){
                        output[i]="NO";
                        break;
                    }
                    if(temp[k]=='P'){
                        countP++;
                        if(countT==1&&countP==0){
                            //T P      ,    
                            output[i]="NO";
                            break;
                        }
                        if (countP==2){
                            //P    ,    
                            output[i]="NO";
                            break;
                        }
                    }
                    if(temp[k]=='T'){
                        countT++;
                        if(countP==0||count2==0){
                            //T      P A  ,    
                            output[i]="NO";
                            break;
                        }
                        if (countT==2){
                            //T    ,  
                            output[i]="NO";
                            break;
                        }
                    }
                    if(temp[k]=='A'){
                        if(countP==0){
                            count1++;
                        }
                        if(countP==1&&countT==0){
                            count2++;
                        }
                        if(countT==1){
                            count3++;
                        }
                    }
                }
                //count2    
                if(count1*count2==count3&&count2!=0)
                    output[i]="YES";
                if(mark==temp.length&&count1*count2!=count3)
                    output[i]="NO";
            }
            for(int i=0;i<n;i++)
                System.out.println(output[i]);
        }
    }