本文共 1336 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要计算给定字符串中包含多少个“PAT”子串。通过预处理左边的P的数量和右边的T的数量,然后在每个可能的A的位置上计算它们的乘积之和,可以高效地解决这个问题。
preP,其中preP[i]表示从字符串开头到位置i(包括i)左边有多少个P。postT,其中postT[i]表示从位置i到字符串末尾右边有多少个T。preP[i]和postT[i]相乘,并将结果加到总数中。这种方法的时间复杂度是O(n),非常高效,适用于长度很大的字符串。
#include#include using namespace std;#define MOD 1000000007int main() { string m; cin >> m; int n = m.size(); if (n == 0) { cout << 0 << endl; return 0; } vector preP(n, 0); preP[0] = (m[0] == 'P') ? 1 : 0; for (int i = 1; i < n; ++i) { preP[i] = (m[i] == 'P') ? preP[i-1] + 1 : preP[i-1]; } vector postT(n, 0); postT[n-1] = (m[n-1] == 'T') ? 1 : 0; for (int i = n-2; i >= 0; --i) { postT[i] = (m[i] == 'T') ? postT[i+1] + 1 : postT[i+1]; } long long res = 0; for (int i = 0; i < n; ++i) { if (m[i] == 'A') { res = (res + preP[i] * postT[i]) % MOD; } } cout << res % MOD << endl; return 0;}
m。preP和postT,分别记录每个位置左边的P的数量和右边的T的数量。preP[i]和postT[i]的乘积,并累加到结果中,最后输出结果模1e9+7。这种方法确保了在处理大字符串时的效率,避免了暴力枚举所有可能的子串。
转载地址:http://azbwz.baihongyu.com/