PAT-B 1003. 我要通过!(20)
2017-03-21 19:50
218 查看
题目链接在此。
字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
由条件1.2可知:
1. “PAT”是最原始的字符串
2. 通过2可引申出“APATA”、“AAPATAA”、“AAAPATAAA”等等形式都是正确的
条件3的意思是,满足aPbTc这种形式的字符串(比如AAPATAA,由条件2知道a和c一定相等),在P和T之间加入一个A之后,需要在T的左边加上P的右边A的个数个A,那么AAPATAA在PT之间加上一个A之后就会变成AAPAATAAAA。
综上,可以得到如下几条:
1. 只能有P,A,T这三种字符,有其他字符直接输出NO
2. PAT是最原始的形式,条件2对应的字符串是最底层的模式,最底层模式是指PT之间只能有一个A,且只能有一个P和一个A
3. 如果想在“PAT”中P的左边加上A,则右边也要加上相等数量的A
4. 在“mPATm”(m表示m个A)中的P、T中间加上n个A,则T的右边需要加上m*n个A,由此得到下一条:
5. 记P之前的A的个数为x,PT之间的个数为y,T之后A的个数为z,x,y,z满足x*y==z
到此,相信思路已经很清晰了,只要找到P和T的位置,这样就能得出P之前、PT之间以及T之后的A的个数,通过总结5的关系式就可以得出结果。
题意理解
这个题目最主要的还是理解题意了,这三个条件之间除了有各自的意思,还能通过结合来引申出不同的正确的字符串,并且相互制约,看一下那三个条件:字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
由条件1.2可知:
1. “PAT”是最原始的字符串
2. 通过2可引申出“APATA”、“AAPATAA”、“AAAPATAAA”等等形式都是正确的
条件3的意思是,满足aPbTc这种形式的字符串(比如AAPATAA,由条件2知道a和c一定相等),在P和T之间加入一个A之后,需要在T的左边加上P的右边A的个数个A,那么AAPATAA在PT之间加上一个A之后就会变成AAPAATAAAA。
综上,可以得到如下几条:
1. 只能有P,A,T这三种字符,有其他字符直接输出NO
2. PAT是最原始的形式,条件2对应的字符串是最底层的模式,最底层模式是指PT之间只能有一个A,且只能有一个P和一个A
3. 如果想在“PAT”中P的左边加上A,则右边也要加上相等数量的A
4. 在“mPATm”(m表示m个A)中的P、T中间加上n个A,则T的右边需要加上m*n个A,由此得到下一条:
5. 记P之前的A的个数为x,PT之间的个数为y,T之后A的个数为z,x,y,z满足x*y==z
到此,相信思路已经很清晰了,只要找到P和T的位置,这样就能得出P之前、PT之间以及T之后的A的个数,通过总结5的关系式就可以得出结果。
AC代码
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main(){ int n; char str[100]; scanf("%d",&n); while(n--){ //需要验证n个字符串 scanf("%s",str); //读入字符串 int len = strlen(str); int numP = 0, numT = 0, other = 0; //P,T,除PAT以外其他字符的数目< 4000 /span> int posP = -1, posT = -1; //P,T所在下标 for(int i = 0; i < len; i++){ if(str[i] == 'P'){ //如果当前位为P numP++; //P的数量+1 posP = i; //记录好P的位置 }else if(str[i] == 'T'){ //如果当前位为T numT++; //T的数量+1 posT = i; //记录好T的位置 }else if(str[i] != 'A'){ //如果当前位不是P,A,T其中之一 other++; //其他字符数量+1 } } if(other > 0 || numP != 1 || numT != 1 || posT-posP<=1 ){ //如果有其他字符,或者PT的数量不是1 ,或者PT之间没有A(这种容易忽略) printf("NO\n"); //直接输出NO }else{ //满足条件1 int x = posP; //P之前A的个数 int y = posT-posP-1; //PT之间A的个数 int z = len-posT-1; //T之后A的个数 if(x*y == z){ //满足要求 printf("YES\n"); }else{ //不满足要求 printf("NO\n"); } } } return 0; }
相关文章推荐
- PAT 乙级1003. 我要通过!(20)
- PAT basic 1003. 我要通过!(20)
- 1003. 我要通过!(20) (ZJUPAT 模拟)
- PAT乙级1003. 我要通过!(20)
- PAT (Basic Level) Practise (中文)1003. 我要通过!(20)
- PAT (Basic Level) Practise (中文)1003. 我要通过!(20)
- 1003. 我要通过!(20)-PAT乙级
- PAT乙级 1003. 我要通过!(20)
- PAT --- 1003. 我要通过!(20)
- 浙江大学PAT乙级试题.1003. 我要通过!(20)C语言
- PAT乙级 1003. 我要通过!(20)
- PAT Basic 1003. 我要通过!(20)(C语言实现)
- 1003. 我要通过!(20) (ZJUPAT 模拟)
- PAT 1003. 我要通过!(20)--典型的找规律
- PAT 乙级练习题 1003. 我要通过!(20)
- PAT-B 1003. 我要通过!(20) Java版
- PAT 1003. 我要通过!(20)
- PAT乙级1003. 我要通过!(20)
- PAT1003. 我要通过!(20)
- [PAT]1003. 我要通过!(20)