1040 有几个PAT (25分)
题目
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式
输入只有一行,包含一个字符串,长度不超过10^5,只包含 P、A、T 三种字母。
输出格式
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
解析
首先规律呢,是在A上,每遇到一个A,那么A前P数 * A后T数就是总数,每遇到一个A就累加一下,然后出结果啦👌那么只要保存一下每个A前后的P、T数就可以了
我这里呢用数组保存每一个A位置前的P数和每一个A位置后的T数,分别正反遍历一次字符串,i位置前P的数量等于i-1位置前P的数量,同样T数量同理,最后每个位置乘起来就好了👌
说的好像蛮简单的,路子都在那里,这里推荐下面那个代码,搬运别人的,值得学习,真好!
答案
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
int P[100001],T[100001];
int main(){
string s;
int num = 0,i,j = 1,k = 1,sum = 0,a;
cin>>s;
int len = s.length();
for(i = 0; i < len ; i++){
if(s[i] == 'P'){
P[j] ++;
}else if(s[i] == 'A'){
j ++;
P[j] += P[j - 1];
}
}
for(i = len-1; i >= 0; i--){
if(s[i] == 'T'){
T[k] ++;
}else if(s[i] == 'A'){
k ++;
T[k] += T[k - 1];
}
}
j = 1;
while((a = s.find('A')) != -1){
sum += (P[j++] * T[--k]);
sum %= 1000000007;
s[a] = 'B';
}
printf("%d\n",sum%1000000007 );
}
别人家的代码
先遍历字符串数一数有多少个T然后每遇到一个T呢countt–;每遇到一个P呢,countp++;然后一遇到字母A呢就countt * countp,把这个结果累加到result中,最后输出结果就好啦~~
#include<iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int len = s.length(), result = 0, countp = 0, countt = 0;
for (int i = 0; i < len; i++) {
if (s[i] == 'T')
countt++;
}
for (int i = 0; i < len; i++) {
if (s[i] == 'P') countp++;
if (s[i] == 'T') countt--;
if (s[i] == 'A') result = (result + (countp * countt) % 1000000007) % 1000000007;
}
cout << result;
return 0;
}

浙公网安备 33010602011771号