1040 有几个PAT (25分)
1040 有几个PAT (25分)
字符串 APPAPT
中包含了两个单词 PAT
,其中第一个 PAT
是第 2 位(P
),第 4 位(A
),第 6 位(T
);第二个 PAT
是第 3 位(P
),第 4 位(A
),第 6 位(T
)。
现给定字符串,问一共可以形成多少个 PAT
?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P
、A
、T
三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT
。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
代码讲解:看数据的暗示就已经告诉你了,算法只能是o(n),不然就算数据正确也是超时的结果
那就不可能是一个一个的算,用排列组合的思路去思考这道题,如果某个位置是A,那么我们只要
去找前面P的个数,后面T的个数就好了,但一次路过就要求出来的,不能在循环去找,要不然
肯定超时,P的个数和判断A一起都可以算出来,T呢,我们可以利用减法,先把总数求出来,然后
遇到了就减,这样就出了T的个数,俩者相乘就算出了当前A能组合的PAT个数,把所有的A相加结果
对1000000007取余就好了
#include<stdio.h>
int main()
{
char a[100001];
while(scanf("%s",a)!=EOF)
{
int i,j;
int count=0,count_p=0,count_t=0;
for(i=0;a[i]!=0;i++)
{
if(a[i]=='T')
count_t++;
}
for(i=0;a[i]!=0;i++)
{
if(a[i]=='T')
count_t--;
if(a[i]=='A')
{
count=(count+(count_t*count_p)%1000000007)%1000000007;
}
if(a[i]=='P')
{
count_p++;
}
}
int main()
{
char a[100001];
while(scanf("%s",a)!=EOF)
{
int i,j;
int count=0,count_p=0,count_t=0;
for(i=0;a[i]!=0;i++)
{
if(a[i]=='T')
count_t++;
}
for(i=0;a[i]!=0;i++)
{
if(a[i]=='T')
count_t--;
if(a[i]=='A')
{
count=(count+(count_t*count_p)%1000000007)%1000000007;
}
if(a[i]=='P')
{
count_p++;
}
}
printf("%d\n",count);
}
return 0;
}
}
return 0;
}