1040. 有几个PAT(25)
2017-02-06 12:46
183 查看
字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T);第二个PAT是第3位(P),第4位(A),第6位(T)。
现给定字符串,问一共可以形成多少个PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。
输出格式:
在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。
输入样例:
输出样例:
现给定字符串,问一共可以形成多少个PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。
输出格式:
在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。
输入样例:
APPAPT
输出样例:
2
想法是和快排那道题一样, 所有的A左边的P和右边的T数量乘积及总PAT的数量;依次统计每个地方的左边P数量和右边T数量,网上看到更为简洁的方法,大致是逆序统计T
的数量,每遇到A则加上前面T的数量即AT的数量,每遇到P则加上AT的数量即是PAT的数量
#include <stdio.h> #include <string.h> #define MAX 100005 #define LIMIT 1000000007 int main() { char input[MAX]; int len,sum = 0; int i; int leftP[MAX] = {0}; int rightT[MAX] = {0}; scanf("%s",input); len = strlen(input); (input[0]=='P') ? (leftP[0] = 1) : (leftP[0] = 0); (input[len-1]=='T') ? (rightT[len-1] = 1) : (rightT[len-1] = 0); for(i=1;i<len;i++) { (input[i]=='P') ? (leftP[i] = leftP[i-1]+1) : (leftP[i] = leftP[i-1]); (input[len-i-1]=='T') ? (rightT[len-i-1] = rightT[len-i]+1) : (rightT[len-i-1] = rightT[len-i]); } for(i=0;i<len;i++) { if(input[i]=='A') sum += leftP[i]*rightT[i]; sum %= LIMIT; } printf("%d",sum); return 0; }
相关文章推荐
- 1040. 有几个PAT(25)
- 1040. 有几个PAT(25)
- PAT (Basic Level) Practise (中文)1040. 有几个PAT(25) C语言
- PAT(basic level) 1040 有几个PAT(25)
- PAT 1040. 有几个PAT(25)
- [PAT乙级]1040. 有几个PAT(25)
- 1040. 有几个PAT(25)_枚举和在线处理
- 1040. 有几个PAT(25)-浙大PAT乙级真题java实现
- 1040. 有几个PAT(25)
- PAT-B 1040. 有几个PAT(25)
- 1040. 有几个PAT(25)-PAT乙级真题
- 1040. 有几个PAT(25)
- 1040. 有几个PAT(25)
- 1040. 有几个PAT(25)
- 1040. 有几个PAT(25)
- 1040. 有几个PAT(25)
- 1040. 有几个PAT(25)
- PAT乙级 1040. 有几个PAT(25)
- 1040. 有几个PAT(25)(C++)
- 1040. 有几个PAT(25)----暴力