首页 > 其他 > 详细

PAT乙1040 有几个PAT

时间:2020-04-25 18:14:50      阅读:61      评论:0      收藏:0      [点我收藏+]

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616

字符串 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
分析:

从前往后算出每个位置及之前位置所有P的个数

从后往前算出每个位置及之后位置所有T的个数

遍历各位置,如果是A,PAT总数加上此位置之前P的个数乘以此位置之后T的个数(结果mod1000000007 )

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define mood 1000000007
 4 char s[100010];
 5 int nump[100010] = {0};
 6 int numt[100010] = {0};
 7 
 8 int main()
 9 {
10    scanf("%s", s);
11    nump[0] = 0, numt[strlen(s) - 1] = 0;
12    if (s[0] == P)
13       nump[0] = 1;
14    if (s[strlen(s) - 1] == T)
15       numt[strlen(s) - 1] = 1;
16    for (int i = 1; i < strlen(s); i++) // 求出每个位置及之前所有位置P的个数
17    {
18       if (s[i] != P)
19          nump[i] = nump[i - 1];
20       else
21          nump[i] = nump[i - 1] + 1;
22    }
23    for (int i = strlen(s) - 2; i >= 0; i--)// 求出每个位置及之后所有位置T的个数
24    {
25       if (s[i] != T)
26          numt[i] = numt[i + 1];
27       else
28          numt[i] = numt[i + 1] + 1;
29    }
30    int sum = 0;
31    for (int i = 0; i < strlen(s); i++) // 遍历
32    {
33       if (s[i] == A)
34          sum = (sum + (nump[i] % mood * numt[i] % mood) % mood) % mood;
35    }
36    printf("%d\n", sum);
37    return 0;
38 }

 

PAT乙1040 有几个PAT

原文:https://www.cnblogs.com/sqdtss/p/12774030.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!