PAT-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

解题思路:按题目思路理解,此题中每一个P都可和之后的每一个A,T组成一个PAT,每一个A都可和之前的P及之后的T组成PAT,每一个T都可和之前的P,A组成PAT。此代码按照A的数量把每个A能组成的PAT数量相加总和。

提交代码

#include <stdio.h>
#include <string.h>

int main()
{
  char *p,*q;
  char a[100002];
  int nump = 0,numq = 0,s = 0;  //P,T,PAT的数量

  scanf("%s",a);
  p = a;
  q = &a[strlen(a) - 1];

  while(*p != 'P') //让p指针指向第一个P所在的位置,nump准备计数
    p++;
  while(*q != 'T') //q指针指向最后一个T所在的位置
    q--;

  while(*p != 'A') //让p指针指向第一个A所在的位置
  {
    if(*p == 'P')  //记下p的个数
      nump++;
    p++;
  }
  while(q > p)     //记下当前p位置之后T的个数
  {
    if(*q == 'T')
      numq++;
    q--;
  }
  q = &a[strlen(a) - 1];

  while(q > p)
  {
    if(*p == 'A')   //每遇到一个A,累加能组成PAT的数量
    {
      s += (nump * numq);
      if(s >= 1000000007)
        s %= 1000000007;
    }
    else if(*p == 'P')
      nump++;
    else if(*p == 'T')
      numq--;
    p++;
  }

  printf("%d\n",s);

  return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值