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