辞树的QAQ水题 (前缀和乘积)

题目描述 蒟蒻的辞树又被吊打了嘤嘤嘤。留下了属于弱者的眼泪QAQAQAQAQAAQAAQA······ 现在我 们定义辞树的悲伤值 F 。F的值为主串中子序列为”QAQ”的个数。注意字母“QAQ”不一定是 连续的,但是字母的顺序应该是准确的。
输入 输入一个整数T(0 ≤ T ≤ 20),代表有T组数据。每组数据会给出一个字符串S,长度为len,0 < len ≤ 1000000
输出
根据每组的字符串,输出辞树的悲伤值F,每组数据换行。
输入样例
2 QAQAQYSYIOIWIN QAQQ
输出样例
4 2

#include<cstdio>
#include<string>
#include<iostream>

using namespace std;

string str, ss;
long long sum;

int main()
{
    int t;
    scanf ("%d", &t);
    while (t--)
    {
        cin >> str;
        int len = str.size();
        int ans_Q = 0, ans_A = 0; // 用来记录A,Q的数量 
        for (int i = 0; i < len; i++)
        {
            if (str[i] == 'Q' || str[i] == 'A')
            {
                ss += str[i];
                if (str[i] == 'A')
                    ans_A ++;
                else ans_Q ++;
            }
        }
        int appear_A = 0;
        sum = 0;
        for (int i = 0; ans_A > 0; i++)
        {
            if (ss[i] == 'A')
            {
                sum += (i - appear_A) * (ans_Q - (i-appear_A));
//当前所有字母的数目-出现A的数目就是当前A左边的数目 
//所有Q的数目-左边的数目就是右边Q的数目 
                appear_A ++;
                ans_A --;
            }
        }
        printf ("%lld\n", sum);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hqzzbh/article/details/81168359