A 辞树的QAQ水题

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

由于数据较大,暴力解题,一定会超时。故必须换种思路。
假设有QQAQQQ,A左边的Q数为2,右边的Q数为3,则QAQ字串
总数为2 X 3 = 6,即为解题的突破口所在.
#include<stdio.h>
#include<string.h>
char s[1000005];
int a[1000000];
int b[1000000];
int main()
{
	int t;
	scanf("%d",&t);
	while (t--)
	{
		int i,l,n,sum=0;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		scanf("%s",s);
		l = strlen(s);
		int left = 0,num1=0;
		int right = l-1,num2=0;
		while (left<l)
		{
			if (s[left]=='Q'&&s[left]!='A')
			{
				num1++;
				a[left++] = num1;
			}
			else
				a[left++] = num1;
			if (s[right]=='Q'&&s[right]!='A')
			{
				num2++;
				b[right--] = num2;
			}
			else
				b[right--] = num2;
		}
		for (i=0;i<l;i++)
			if (s[i]=='A')
				sum+=a[i-1]*b[i+1];
		printf("%d\n",sum);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值