美文网首页
1040 有几个PAT

1040 有几个PAT

作者: 初见还是重逢 | 来源:发表于2019-03-29 13:05 被阅读0次

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

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

    输入格式:

    输入只有一行,包含一个字符串,长度不超过10^​5,只包含 P、A、T 三种字母。

    输出格式:

    在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。

    输入样例:

    APPAPT

    输出样例:

    2

    思路:

    本题难度较大,但是不是编程上的难度,而是算法上的难度,一开始想的是用三重循环,一个一个统计PAT的个数,但是这样的算法后面的几个测试用例都会超时,最后实在是想不出来什么好的方法,借鉴网上大神的方法,豁然开朗,只要对每一个A的前后进行P与T的计数,用(A前P的数量)*(A后T的数量),即可得到由此A可以构建的所有PAT的数量,最后累加即可,整个代码也很简洁。

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    int main()
    {
        string pat;
        cin >> pat;
        long long count = 0, count_p = 0, count_t = 0;//注意要使用long long类型,不然乘法的时候有可能越界
    
        for (int i = 0; i < pat.size(); i++)//首先计算总共有多少个T
        {
            if (pat[i] == 'T')count_t++;
        }
        for (int i = 0; i < pat.size(); i++)//对每一个A进行遍历,计算前面多少个P,后面多少个T
        {
            if (pat[i] == 'P')count_p++;//前面有P就增加
            if (pat[i] == 'T')count_t--;//前面有T证明后面的T的个数要减少
            if (pat[i] == 'A')count += count_p*count_t;//A可以构建的所有PAT的计数
        }
        cout << count % 1000000007;//总的个数需要对1000000007取余数
        return 0;
    }
    

    代码:

    有几个PAT

    //1040 有几个PAT
    //本题难度较大,但是不是编程的难度而是算法的难度,一开始想的是用三重循环,一个一个统计pat的个数,但是这样后面的几个测试用例都会超时
    //最后实在是想不出来什么好的方法,借鉴别人的,豁然开朗,只要对每一个A的前后进行P与T的计数,用A前P的数量*A后T的数量,即可得到由此A可以构建的所有PAT的数量
    //因此最后只用对整个数组进行两次循环即可
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    int main()
    {
        string pat;
        cin >> pat;
        long long count = 0, count_p = 0, count_t = 0;//注意要使用long long类型,不然乘法的时候有可能越界
    
        for (int i = 0; i < pat.size(); i++)//首先计算总共有多少个T
        {
            if (pat[i] == 'T')count_t++;
        }
        for (int i = 0; i < pat.size(); i++)//对每一个A进行遍历,计算前面多少个P,后面多少个T
        {
            if (pat[i] == 'P')count_p++;//前面有P就增加
            if (pat[i] == 'T')count_t--;//前面有T证明后面的T的个数要减少
            if (pat[i] == 'A')count += count_p*count_t;//A可以构建的所有PAT的计数
        }
        cout << count % 1000000007;//总的个数需要对1000000007取余数
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:1040 有几个PAT

          本文链接:https://www.haomeiwen.com/subject/gbzcmqtx.html