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 #include2 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<