PAT Basic 1040

1040 有几个PAT

字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T);第二个PAT是第3位(P),第4位(A),第6位(T)。

现给定字符串,问一共可以形成多少个PAT?

输入格式:

输入只有一行,包含一个字符串,长度不超过10^5^,只包含P、A、T三种字母。

输出格式:

在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。

输入样例:

APPAPT

输出样例:

2

  题解:这道题乍一看感觉完全无从下手啊,难道要我在考场上写一个LCS求他和PAT这个串的最大公共子序列根据他的矩阵图求解?直接暴力的话肯定超时啊。
  不过在冷(wang)静(shang)思(cha)考(yue)后,发现事情没有我想的那么复杂,正面直接寻找或许确实很难,那我们不妨从后面开始找, 我们可以一个一个找,先找T的数量,当碰到A时,这时AT的数量就是AT原有的数量(初始化为0)加上T的数量,碰上P时,PAT的数量就是PAT原有的数量加上AT的数量。倒着跑一遍该字符串即可。

代码如下:
 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     string a;
 8     cin>>a;
 9     long long int num_t = 0, num_at = 0, num_pat = 0;
10     for(int i = a.length(); i >= 0; i--){
11         if( a[i] == 'T')
12             num_t++;
13         else if( a[i] == 'A')
14             num_at =(num_at + num_t )%1000000007;
15         else if( a[i] == 'P')
16             num_pat = (num_pat + num_at) %1000000007; 
17     }
18     cout<<num_pat;
19     return 0;
20 }
 

猜你喜欢

转载自www.cnblogs.com/yxp400/p/9460308.html