一开始想着的事记录p的位置a的位置t的位置,然后再去找每个p后面有多少个a,以及这个a后面有多少个t。
后来看了人家的解法,发现其实可以统计每个a前面有多少个p,以及后面有多少个t。然后把结果乘起来,然后再加起来就可以了。
两次遍历构建,一次遍历计算结果。
完美。好好学,好好看。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cstdio>
#include <map>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 1000000007;
int pp[100111];
int tt[100111];
char pat[100111];
int main()
{
int i,j,k,m,n;
gets(pat);
k = strlen(pat);
m = 0;
for(i = 0;i < k;i++)
{
if(pat[i] == 'P')
m++;
else if(pat[i]=='A')
pp[i] = m;
}
n = 0;
for(i = k-1;i > 0;i--)
{
if(pat[i] == 'T')
n++;
else if(pat[i]=='A')
tt[i] = n;
}
long long ans = 0;
for(i = 1;i<k-1;i++)
if(pat[i] == 'A')
ans = (ans + pp[i] * tt[i])%maxn;
ans = ans % maxn;
printf("%d\n", ans);
return 0;
}

本文介绍了一种优化算法,用于高效计算字符串中特定字符组合(PAT)的数量。通过两次遍历构建前缀和后缀信息,再进行一次遍历计算结果,实现了时间和空间的高效利用。文章详细解释了算法原理,并提供了完整的C++代码实现。
1739

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



