逐步递推 A1093 Count PAT‘s (25 分)

暴力会超时。

思路: 每个字母A左边的P的个数 * 该字母A右边的T的个数 ,然后结果相加即可。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 100010;
const int mod = 1000000007;

int main(int argc, char** argv) {
    
    
	
	int leftP[maxn] = {
    
    0}, rightT = 0;
	string str;
	
	cin >> str;
	
	int len = str.length();
	
	for(int i = 0; i < len; i++){
    
    
		if(i > 0){
    
    
			leftP[i] = leftP[i-1];
		}
		
		if(str[i] == 'P'){
    
    
			leftP[i]++;
		}	
	}
	
	int ans = 0;
	
	for(int i = len-1; i >= 0; i--){
    
    
		if(str[i] == 'T'){
    
    
			rightT++;
		}else if(str[i] == 'A'){
    
    
			ans = (ans + rightT * leftP[i]) % mod;
		}
	}
	
	cout << ans;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/alovelypeach/article/details/114404290