字符串 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
#include <stdio.h>
#include <string.h>
#define max 100010
#define md 1000000007
int leftp[max]={0};
void solution1(char s[]){
int len=strlen(s);
for(int i=0;i<len;i++){
if(i>0){
if(s[i]=='P'){
leftp[i]=leftp[i-1]+1;
}
else{
leftp[i]=leftp[i-1];
}
}
else{
if(s[i]=='P'){
leftp[0]=1;
}
else leftp[0]=0;
}
}
// for(int i=0;i<len;i++){
// if(i>0){
// leftp[i]=leftp[i-1];
// }
// if(s[i]=='P'){
// leftp[i]++;
// }
// }
int cnt=0,rightT=0;
for(int i=len-1;i>=0;i--){
if(s[i]=='T'){
rightT++;
}else if(s[i]=='A'){
cnt=(cnt+leftp[i]*rightT)%md;
}
}
printf("%d",cnt);
}
void solution2(char s[]){
int len=strlen(s),numt=0,nump=0,numa=0;
for(int i=0;i<len;i++){
if(s[i]=='T'){
numt++;
}
}
int ans=0;
for(int i=0;i<len;i++){
if(s[i]=='P') nump++;
if(s[i]=='T') numt--;
if(s[i]=='A') ans=(ans+nump*numt)%md;
}
printf("%d",ans);
}
int main(){
char s[max];
scanf("%s",s);
//solution1(s);
solution2(s);
return 0;
}
1、一定要看清 数组的最大长度是多少个0...不然 char s[max] 不对 会段错误。
2、除以10000000000007 是在 每次cnt或者ans 相加后取余 ,最后输出cnt%md 会错误。
3、原来是判断A的左右分别有多少个P T.