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 }