第一次代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char c[100005];
scanf("%s",c);
int l=strlen(c);
long long time=0;
for(int i=0;i<l;i++)
{
if(c[i]=='P')
{
for(int j=i+1;j<l;j++)
{
if(c[j]=='A')
{
for(int k=j+1;k<l;k++)
{
if(c[k]=='T')
{
time++;
}
}
}
}
}
}
int t=1000000007;
printf("%lld",time%t);
return 0;
}
复杂度太高
第二次借鉴思路代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char c[100005];
scanf("%s",c);
int l=strlen(c);
long long numt,numat,numpat;
numt=numat=numpat=0;
while(l--)
{
if(c[l]=='T')numt++;
else if(c[l]=='A')
{
numat+=numt;
}
else
{
numpat+=numat;
}
}
int t=1000000007;
printf("%lld",numpat%t);
return 0;
}
每个P对应PAT种类取决于这个P的后面,有多少种AT可选(如果有一个P出现,则只要知道后面有多少种AT可选,则这个P可以对应的PAT选择方法就有多少种)。
一个P后面有多少种AT可选,其实和这个字符串中多少种PAT可选是一个问题,即所有的A对应的AT选法的和;
一个A对应的AT种类取决于这个A后面有多少种T可选(如果有一个A出现,则只要知道后面有多少种T出现,则这个A对应的AT选择方法就有多少种)。