A 辞树的QAQ水题

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

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
int main()
{
	int n;
	scanf("%d\n",&n);  //记得添加一个换行吸收回车符 
	while(n--)
	{
		char s1[(int)1e6],s[(int)1e6];
		gets(s1);
		int i,j=0,a=0,q=0;
		for(i=0;i<strlen(s1);i++) //将s1预处理为只含QA的字符串,并记录QA的个数 
		{
			if(s1[i]=='A')
			{
				s[j++]=s1[i];
				a++;   
			}
			else if(s1[i]=='Q')
			{
				s[j++]=s1[i];
				q++;
			}
		}
		//puts(s);
		int k=a,sum=0;
		//printf("%d\n",k);
		for(i=0;k>0;i++)   //以a出现的次数为循环条件,出现a次则循环结束 
		{
			if(s[i]=='A')
			{
				sum+=(i-(a-k))*(q-i+(a-k));  //i-(a-k)代表下标为i处的a前边有几个q 
				k--;						//q-i+(a-k)代表下标为i处的a后边有几个q
			}
		}
		printf("%d\n",sum);   
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yuebaba/article/details/81161612