题目描述
蒟蒻的辞树又被吊打了嘤嘤嘤。留下了属于弱者的眼泪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;
}