1003. 我要通过!(20)
题目链接:http://www.patest.cn/contests/pat-b-practise/1003
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
规则总结为:P之前的A的个数乘以P与T之间的A的个数等于P后面的A的个数
对于第2个规则x*1=x
对于第3个规则初始条件为aPbTc 是正确的,则说明b必定等于A,且a=c=A,结论为aPbATca 也是正确的,说明a*b=a*a,且c*a=a*a即a*b=c*a。然后第三条规则可以递归,产生式为b->bA。
代码如下:
1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 using namespace std; 5 6 int indexP,indexT,n,leng; 7 string st; 8 9 10 int main() 11 { 12 cin>>n; 13 while(n--) 14 { 15 cin>>st; 16 indexP=st.find("P"); 17 indexT=st.find("T"); 18 leng=st.length(); 19 if(indexP+1>=indexT||indexP==string::npos||indexT==string::npos) 20 { 21 cout<<"NO"<<endl; 22 } 23 else 24 { 25 string st1(st,0,indexP); 26 string st2(st,indexP+1,indexT-indexP-1); 27 string st3(st,indexT+1,leng-indexT-1); 28 string new_st=st1+st2+st3; 29 if(new_st.find_first_not_of("A")!=string::npos) 30 { 31 cout<<"NO"<<endl; 32 } 33 else 34 { 35 if(indexP==0&&leng-indexT-1==0) //P和T之间可以有任意个A 36 cout<<"YES"<<endl; 37 else if(indexP*(indexT-indexP-1)==leng-indexT-1) 38 cout<<"YES"<<endl; 39 else 40 cout<<"NO"<<endl; 41 } 42 } 43 } 44 return 0; 45 }
相关知识:
1.string中的find_first_not_of()函数
new_st.find_first_not_of("A")!=string::npos可以用来判断new_st中有没有“A”。
2.string的一种声明方法:string str10(str,1,4);1位开始下标,4位下标1之后的长度。