题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5907
题目大意就是说,给定一个字符串,找出里面q连续的地方,得到一个数,比如样例
quailtyqqq
第一个q只有自己一个,那么就只有一种排列方式,到了后面的qqq,排列方式就有六种了,单独q排一次,三种,每相邻的两个q排一次,那就是两次,再来就是三个q一起排,又是一次。
所以输出7。
这,实在是太简单了,比如qqq,其实就是3+2+1,qqqq就是4+3+2+1。然后,为什么A(3,3)也是等于6啊!我一开始以为是组合数然后完美的wa了一发,我就懵逼了好久,后面才发现,这不就是一个梯形公式吗?这还不是关键的。
我们来看看数据量,这个字符串最长可以到100000,五个0,十万,如果全部都是q,会有什么后果?按照梯形公式,(1+100000)*100000 / 2,这个数字算出来最后是50亿多吧,你像我那么天真,sum用long long,但是计算他有多少个q的那个计数变量cout,却用了int 吗?int最高是到21亿的啊。。。所以上面这个数据,sum是可以存下,但是就是说(1+cout)*cout / 2,cout是int型,所以它参与运算最后得出的结果只能会是int型,这就瞬间存不下了,尽管你的sum是long long。所以,只需要,把cout改成long long,然后就过了,我的天啊!!!!我怎么这么蠢啊,我保证不再犯这种错误了!
代码如下:
#include<stdio.h>
int main()
{
int T, i, j;
char s[100005];
long long sum, cout;
scanf("%d",&T);
while(T--)
{
sum = 0;
scanf("%s",s);
for(i = 0; s[i]; i++)
{
if(s[i] == 'q')
{
for(j = i, cout = 0; s[j] == 'q'; j++)
cout++;
i = j - 1;
sum += (cout + 1) * cout / 2;
}
}
printf("%I64d\n", sum);
}
}