字符串 APPAPT
中包含了两个单词 PAT
,其中第一个 PAT
是第 2 位(P
),第 4 位(A
),第 6 位(T
);第二个 PAT
是第 3 位(P
),第 4 位(A
),第 6 位(T
)。
现给定字符串,问一共可以形成多少个 PAT
?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P
、A
、T
三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT
。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
思路:看了好几遍没什么思路,最后看了算法笔记上的解析 ,PAT的个数等于每个A左边P的个数*右边T的个数
然后就是找P和T的过程了,自己写的两个for循环超时了,书上的代码真的很巧妙,值得学习
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100001
#define maxk 1000000007
int leftnump[maxn]={0};
int main()
{
string s;
cin>>s;
int tnum=0,sum=0;
int l=s.length();
for(int i=0;i<l;i++)
{
if(i>0)
leftnump[i]=leftnump[i-1]; //把每一个A左边P的个数存到相应的位置
if(s[i]=='P')
leftnump[i]++;
}
for(int j=l-1;j>=0;j--)
{
if(s[j]=='T') //从右边找T的个数
tnum++;
else if(s[j]=='A')
sum=(sum+leftnump[j]*tnum)%maxk;
}
cout<<sum<<endl;
return 0;
}
超时代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100001
#define maxk 1000000007
int findp(string s,int num)
{
int f=0;
for(int i=num;i>=0;i--)
if(s[i]=='P')
f++;
return f;
}
int findt(string s,int num)
{
int f=0;
for(int i=num;i<s.length();i++)
if(s[i]=='T')
f++;
return f;
}
int main()
{
string s;
int i,l,sum=0;
cin>>s;
i=s.find('A');
l=s.length();
for(;i<l;i++)
{
if(s[i]=='A')
sum+=findp(s,i)*findt(s,i);
}
cout<<sum%maxk;
return 0;
}