1040 有几个PAT (25分)

1040 有几个PAT (25分)
 

字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。

现给定字符串,问一共可以形成多少个 PAT

输入格式:

输入只有一行,包含一个字符串,长度不超过105​​,只包含 PAT 三种字母。

输出格式:

在一行中输出给定字符串中包含多少个 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++;
     }
 }
 
 printf("%d\n",count);
}
 return 0;
}






posted @ 2020-11-01 18:41  罪梦者  阅读(59)  评论(0)    收藏  举报