题目描述
字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位( P ),第4位(A),第6位(T);第二个PAT是第3位( P ),第4位(A),第6位(T)。
现给定字符串,问一共可以形成多少个PAT?
输入描述:
输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。
APPAPT
输出描述:
在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。
2
原代码
#include<stdio.h>
int main()
{
int psum=0,tsum=0,i=0,j=0;
int p[100000],t[100000];
long long int sum=0;
char c;
while((c=getchar())!='\n')
{
if(c=='P')
{
psum++;
}
else if(c=='A')
{
p[i]=psum;
t[i++]=tsum;
}
else if(c=='T')
{
tsum++;
}
}
for(j=0;j<i;j++)
sum+=p[j]*(tsum-t[j]);
printf("%lld",sum%1000000007);
}
想法:
记录每个A前P和T个数,计算前P与后T成绩和
优化码
#include <stdio.h>
int main()
{
char c; int p=0, pa=0, pat=0;
while((c=getchar())!='\n')
{
if(c == 'P')
{ p++; }
else if(c == 'A')
{
pa += p;
pa = pa%1000000007;
}
else
{
pat += pa;
pat = pat%1000000007;
}
}
printf("%d\n", pat);
return 0;
}
思路
统计pat需要pa的数量,统计pa需要p的数量,一步一步判断即可
变为加减法,运行速度相差不大,占用空间变小