PAT - A1093 Count PAT’s (25 分) https://pintia.cn/problem-sets/994805342720868352/problems/994805373582557184
PAT - B1040 有几个PAT (25 分) https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616
大致思路:
(题意不难,但有时间限制,完全暴力处理不可取。这次自己想的算法比《算法笔记》给的貌似要好一些~)
从左往右扫描给定字符串序列,分别累计P
、PA
和PAT
的数量(初值均为0;过程中完成取模),其中:
P
:每遇到一次P加一即可;PA
:每次遇到A更新,为其前面已构成的"PA"的数量,加上由此A新形成的"PA"的数量(即此A前面所有的P的数量);PAT
:每次遇到T更新,为其前面已构成的"PAT"的数量,加上由此T新形成的"PAT"的数量(即此T前面所有的PA的数量);
通过代码(C/C++):
#include<stdio.h>
int main(){
int num_p=0, num_pa=0, num_pat = 0;
char ch=getchar();
while(ch!='\n'){
switch(ch){
case 'P': //遇到P更新P的数量
num_p++;
break;
case 'A': //遇到A更新PA的数量,新增量为此A之前所有的P的数量(与此A形成新的PA)
num_pa=(num_pa+num_p)%1000000007;
break;
case 'T': //遇到T更新PAT的数量,新增量为此T之前所有PA的数量(与此T形成新的PAT)
num_pat=(num_pat+num_pa)%1000000007;
break;
}
ch=getchar();
}
printf("%d\n", num_pat);
return 0;
}