题目粗心:
给定一个只蕴含P,A,T的字符串,让其计算有多少个PAT组合
算法思路:
对一个确定地位的A来说,以它造成的PAT的个数等于它右边P的些个数乘以它左边T的个数。例如对字符申APPAPT的两头那个A来说,它右边有两个P,左边有一个T,因而这个A能造成的PAT的个数就是2x1=2.于是问题就转换为:对字符串中的每个A,计算它右边P的个数与它左边T的个数的乘积,而后把所有A的这个乘积相加,最初的后果就是该字符串中所有的PAT组合数目。那么当初就是须要获取每一个地位的右边的P和左边的T的数,在这里咱们应用leftP
和rightP
别离保留以后地位右边的P和左边的T的个数。之所以能够这样保留,是因为以后地位i右边的P的个数和i-1地位右边P的个数具备继承性,要么相等,要么相差1。那么这样咱们能够先遍历一遍所有的字符串中所有的T呈现的个数,而后应用ans
保留所有的PAT组合数目,再次遍历字符串的过程中,如果以后字符为P那么就让leftP
加1,如果为T,就让rightT
减一,如果为A,就累计leftP*rightT
。
留神点:
1、测试点3和4考查取模,不能在最初统计实现后再取模,须要每计算一次就取模。
提交后果:
AC代码:
#include <cstdio>#include <string>#include <iostream>using namespace std;int main(){ string s; cin>>s; int len = s.size(); int leftP = 0; int rightT = 0; int ans = 0;//记录PAT的个数 for (int i = 0; i < len; ++i) { if(s[i]=='T'){ ++rightT; } } for (int j = 0; j < len; ++j) { if(s[j]=='P'){ ++leftP; } else if(s[j]=='T'){ --rightT; } else if(s[j]=='A'){ ans += leftP*rightT; ans %= 1000000007; } } cout<<ans; return 0;}