PAT乙级-1040有几个PAT
解题思路:第一次想的是先统计P个数,然后统计A个数,相乘,再统计T个数,相乘,取余;后面想到PAT之间相应关系,一边遍历字符串,一边统计P A T各字符出现的次数,对于P出现了n次,再出现一次A,PA次数毫无疑问为P的次数;
对于PA出现n次,P出现m次,再出现一次A,那么这个A和之前的P构成PA关系,也就是新增加m次PA,不影响之前PA次数,所以共n+m次;
对于PAT次数一样,只要出现一次T,T和之前k次PA形成PAT关系,PAT次数加上k,得到所有的PAT次数,记得一边统计一边取模。
解题代码:(这次用的C)
#include<stdio.h>
#include<string.h>
int main()
{
char ch[100005];//字符串长度小于1E5,定义1E5+5的字符数组
scanf("%s",ch);//字符串格式输入ch
int P=0,PA=0,PAT=0,i;//从左往右P个数,PA个数,PAT个数,循环变量i
for(i=0;i<strlen(ch);i++){//对于字符串ch,从左往右遍历,统计P,PA,PAT出现次数
if(ch[i]=='P') P++;
else if(ch[i]=='A') PA+=P;
/*PA次数等于PA次数加上P次数,例如TPAPTTA到A位置为,第一个位置P个数为1,PA个数为1,第二个A位置,P个数为2,PA个数为1+2=3,可能本题难点就在搞懂PA个数与P个数关系,懂了这个,PA个数与PAT个数也就差不多了
*/
else {PAT+=PA;PAT%=1000000007;}//PAT对mod取模(取余)
}
printf("%d",PAT);//C语言输出
return 0;
}