1040 有几个PAT(25 分)
字符串 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
作者: CAO, Peng
单位: Google
时间限制: 150 ms
内存限制: 64 MB
代码长度限制: 16 KB
1、编译器:Java
import java.util.*;
public class T1040{
int a1=0,a3=0;
int sum=0;
char []c;
void sumT(String s)
{
c=s.toCharArray();
a3=0;
for(int i=0;i<c.length;i++)
{
if(c[i]=='T')a3++;
}
}
int modSum()
{
for(int i=0;i<c.length;i++)
{
if(c[i]=='A')sum+=a1*a3;
else if(c[i]=='P')a1++;
else
a3--;
if(sum>1000000007)sum-=1000000007;
}
return sum;
}
public static void main (String []args)
{
Scanner re=new Scanner(System.in);
String s=re.next();
T1040 m=new T1040();
m.sumT(s);
System.out.println(m.modSum());
}
}
提交结果(截屏):
2、编译器:C
#include <stdio.h>
int main(int argc, char *argv[])
{
int a1=0,a3=0;
int sum=0,k=0;
char c[200];
while((c[k]=getchar())!='\n')
{
if(c[k]=='T')a3++;
k++;
}
c[k]='\0';
k--;
for(int i=0;i<k;i++)
{
if(c[i]=='A')sum+=a1*a3;
else if(c[i]=='P')a1++;
else
a3--;
if(sum>1000000007)sum-=1000000007;
}
printf("%d",sum);
return 0;
}
提交结果(截屏):
求解正确答案!
正解:
##编译器:C++
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main() {
string s; cin >> s;
int size = s.size()-1, i = 0,count=0, numAT=0,numT=0;
for (int i = size; i >= 0; --i)
{ if ('T' == s[i]) ++numT;
else if ('A' == s[i]) numAT += numT;
else { count += numAT;
if (count >= 1000000007)
count %= 1000000007;
}
}
cout << count;
return 0;
}
提交截屏
相同的算法用Java写出来编译
import java.util.Scanner;
public class Main{
public static void main (String []args)
{
Scanner re=new Scanner(System.in);
String s=re.next();
int a2=0;
int a3=0;
int sum=0;
int count;
// char []c;
count=s.length();
// c=s.toCharArray();
for(int i=count-1;i>=0;i--)
{
if(s.charAt(i)=='T')a3++;
else if(s.charAt(i)=='A') a2+=a3;
else {
sum+=a2;
if(sum>=1000000007)sum=sum%1000000007;
}
}
System.out.print(sum);
}
}
结果: