zoukankan      html  css  js  c++  java
  • 【算法笔记】B1040 有几个PAT

    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

    思路:

    对于每个A,能组成PAT的个数是左边P的个数和右边T的个数的乘积,因此只统计每个字母左边P的个数即可,时间复杂度为O(len)。

    然后从后往前统计T的个数,每遇到一个A就计算一次并加到结果中。

    codes:

     1 #include<iostream>
     2 using namespace std;
     3 const int maxn = 100010;
     4 const int mod = 1000000007;
     5 string str;
     6 int leftNumP[maxn]={0};
     7 int main(){
     8     getline(cin, str);
     9     int len = str.size();
    10     int cnt = 0;
    11     for(int i = 0; i < len; i++){
    12         if(i > 0) 
    13             leftNumP[i] = leftNumP[i - 1];
    14         if(str[i] == 'P') 
    15             leftNumP[i]++;
    16     }
    17     int rightNumT = 0;
    18     for(int i = len - 1; i >= 0; i--){
    19         if(str[i] == 'T') 
    20             rightNumT ++;
    21         else if(str[i] == 'A'){
    22             cnt = (cnt + leftNumP[i] * rightNumT) % mod;
    23         }
    24     }
    25     cout<<cnt;
    26     return 0;
    27 }
  • 相关阅读:
    GLSL逐像素光照 【转】
    GLSL逐顶点光照[转]
    GLSL 基础量定义 【转】
    GLSL纹理贴图 【转】
    NormalMap 贴图 [转]
    glsl镜面水倒影的实现[转]
    C#调用C++Dll封装时遇到的一系列问题【转】
    在C#中使用C++编写的类——用托管C++进行封装[转]
    GEOS 使用的例子
    昌平区2015年义务教育阶段入学工作意见 (含非京籍)
  • 原文地址:https://www.cnblogs.com/chunlinn/p/10598676.html
Copyright © 2011-2022 走看看