版权声明:转载请注明出处 https://blog.csdn.net/warmeyes/article/details/86589125
1040 有几个PAT (25 分)
字符串 APPAPT
中包含了两个单词 PAT
,其中第一个 PAT
是第 2 位(P
),第 4 位(A
),第 6 位(T
);第二个 PAT
是第 3 位(P
),第 4 位(A
),第 6 位(T
)。
现给定字符串,问一共可以形成多少个 PAT
?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P
、A
、T
三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT
。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
解题注意事项:
直接遍历三个字母只能拿到15分,因为使用三次遍历复杂度为O(n^3),所以必定会超时,是个骗分的好方法。
拿满分,思路就很复杂,先判断A左侧有多少个P,再判断A右侧有多少个T,这样左侧A数量*右侧T数量则可以得到正解
1.建立一个数组,用来保存P的数量,从左向右遍历,每一项存储的数据先与前一项相等(第一项为i[0]),如果该项为P,则加一,利用递归的思想。
2.从右往左遍历,直接计算T的数量,每次判断到等于A,则直接使用A左侧相邻数组中的数量乘以右侧T的数量计算,每次遇A重复操作。
#include<cstdio>
#include<cstring>
#include<iostream>
const int MAXN = 100010;
char sen[MAXN];
int numsen[MAXN]= {0};
using namespace std;
int main()
{
scanf("%s",sen); //此处必须用scanf否则cin会发生段错误
int l = strlen(sen);
int sum=0,t=0;
for(int i = 0; i < l; i++)
{
if(i>0)
numsen[i]=numsen[i-1];
if(sen[i] == 'P')
{
numsen[i]++;
}
}
for(int i = l - 1; i >= 0; i--)
{
if(sen[i] == 'T')
t++;
else if(sen[i] == 'A')
sum = (sum + t * numsen[i]) % 1000000007;//根据题意,此处取模,勿忘
}
cout<<sum<<endl;
return 0;
}