题目 A1093 Count PAT’s
-
题意
输入字符串,输出其中可以按顺序组成多少个PAT
,最后输出模1000000007
之后的结果。 -
思路
这题很明显暴力n
接近10^5
会超时。然后根据题目有几个特点,一个是PAT
字母的顺序性,再就是字母可重复数,所以映射的方式也不可取。这里很明显因为顺序性就需要有定位的点,这里可以采取定位A
的位置然后将其左边P
的个数与右边T
的个数进行乘积即为以该A
可以组成的PAT
数。
注意:
计算过程中模1000000007
。 -
Code in C++
#include <cstdio>
#include <cstring>
#define maxn 100005
const int MOD = 1000000007;
char str[maxn];
int leftP[maxn] = {0};
int main()
{
scanf("%s", str);
int lenth = strlen(str);
for (int i = 0; i < lenth; ++i)
{
if (i > 0)
leftP[i] = leftP[i-1];
if (str[i] == 'P')
++leftP[i];
}
int rightT = 0;
long result = 0;
for (int i = lenth - 1; i >=0; --i)
{
if (str[i] == 'T') ++rightT;
else if (str[i] == 'A')
result = (result + leftP[i] * rightT) % MOD;
}
printf("%ld",result);
return 0;
}
小结
搜索了一下关于为什么模1e9+7
的说法。
摘自:EntropyIncreaser知乎回答