辞树的QAQ水题

辞树的QAQ水题


题目描述
蒟蒻的辞树又被吊打了嘤嘤嘤。留下了属于弱者的眼泪QAQAQAQAQAAQAAQA······ 现在我 们定义辞树的悲伤值 F 。F的值为主串中子序列为”QAQ”的个数。注意字母“QAQ”不一定是 连续的,但是字母的顺序应该是准确的。


输入
输入一个整数T(0 ≤ T ≤ 20),代表有T组数据。每组数据会给出一个字符串S,长度为len,0 < len ≤ 1000000


输出
根据每组的字符串,输出辞树的悲伤值F,每组数据换行。


输入样例
2
QAQAQYSYIOIWIN
QAQQ


输出样例
4
2


思路:先遍历找到所有‘Q’,然后遍历所有的‘A’,找每个‘A’最前面的’Q’的个数,用总的减去前面的得到后面’Q’的个数,所有的左右两边’Q’的个数相乘之积的和就是最终的结果。注意不要用三重循环的嵌套会超时。


#include <stdio.h>
#include <string.h>
#include <math.h>
const int MAX = 1e6+10;   //注意长度的定义
using namespace std;

char ch[MAX];
int a[MAX],b[MAX];
struct node
{
    int left,right;
}p[MAX];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int s,i,num,m,n;
        long long k=0;
        scanf("%s",&ch);
        getchar();
        s=strlen(ch);
        m=0;
        num=0;
        for(i=0;i<s;i++)
        {
            if(ch[i]=='Q')
                num++;
            a[i]=num;
            if(ch[i]=='A') p[m++].left = a[i];     //左右两边同时计数
        }
        num=0;
        n=m;
        for(i=s-1;i>=0;i--)
        {
            if(ch[i]=='Q')
                num++;
            b[s-i-1]=num;
            if(ch[i]=='A') p[--n].right = b[s-i-1];      //左右两边同时计数
        }
        for(i=0;i<m;i++)
            k+=p[i].left*p[i].right;
        printf("%lld\n",k);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shf1730797676/article/details/82019909