思路:
1.它要找有几个PTA,用c语言中的strchr函数即可
#include<stdio.h>
#include<string.h>
int main()
{
char ch[100001];
int count=0;
for(int i=0;;i++)
{
scanf("%c",&ch[i]);
if(ch[i]=='\n') break;
}
char* p=strchr(ch,'P');
char* p1=p;
char* max(char* a,char* b);
while(*p)
{
char* a=strchr(p+1,'A');
char* a1=a;
while(*a)
{
char* t=strchr(a+1,'T');
char* t1=t;
while(*t)
{
if(p<a&&a<t)
{
count++;
}
t1=strchr(max(t+1,a+1),'T');
if(t1!=NULL) t=t1;
else if(t1==NULL) break;
}
a1=strchr(max(a+1,p+1),'A');
if(a1!=NULL) a=a1;
else if(a1==NULL) break;
}
p1=strchr(p+1,'P');
if(p1!=NULL) p=p1;
else if(p1==NULL) break;
}
count=count%1000000007;
printf("%d",count);
}
char* max(char* a,char* b)
{
a>=b?(a=a):(a=b);
return a;
}
这就很离谱了。
等会上网再查查。
好的,我回来了,还是不是很理解究竟错在哪,如果有厉害的同学可以告诉我。
所以我只能另辟蹊径,换一种方法。
更换思路,重来。
思路2.0:
1.要统计有几个"PAT",首先从'T'开始看,看它的前面有几个"PA"组合。
2.而要看有几个"PA"组合,就得看每个'A'的前面有几个'P'。这样的话思路就很容易出来了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
long long int p=0,a=0,t=0;
cin>>str;
for(char i:str)
{
switch(i){
case 'P': p++; break;
case 'A': a+=p; break;
case 'T': t+=a; break;
}
}
cout<<t%1000000007;
return 0;
}
可能有同学对这里面 for(char i:str)有疑问,我解释一下。
这里相当于从str中逐个挑出其中的字符,差不多就是for(int i=0;i<str.size();i++)。
感兴趣的同学可以上网搜一下,稍微了解了解。
这种做法既降低了时间复杂度,使之变为线性的时间复杂度;也没有什么乱七八糟的指针。很方便快速。