题目 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知乎回答
本文详细解析了在长字符串中高效计数特定字符序列“PAT”的算法,避免了暴力匹配的超时问题,通过定位字符A,计算其左侧P与右侧T的数量乘积,巧妙解决顺序性和重复数挑战。
1038

被折叠的 条评论
为什么被折叠?



