A 辞树的QAQ水题

 题目描述

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

输入

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

输出

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

输入样例

2

QAQAQYSYIOIWIN

QAQQ

输出样例

4

2

思路解剖:

       遍历找到所有的"A",再同时找左右两边"Q"的个数,所有的左右两边相乘之积的和就是最终的结果。注意不要用三重循环的嵌套。

My code:

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值