在这个题目上卡了很久,被骗进循环的陷阱里,怎么修改代码都超时,凎!
其实可以很容易分析出来,以‘A’为准,求左边有多少个‘P’,右边有多少个‘T’,把他们相乘就可以确定该‘A’可以组成多少个pat;
《算法笔记》上给了一段代码,思路就是这样,但照着敲这么也ac不过,凎!
看了柳婼的博客才惊叹居然这么简单,复杂度只有O(n),简直是奇女子!
#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; int len = s.length(), result = 0, countp = 0, countt = 0; for (int i = 0; i < len; i++) { if (s[i] == 'T') countt++; } for (int i = 0; i < len; i++) { if (s[i] == 'P') countp++; if (s[i] == 'T') countt--; if (s[i] == 'A') result = (result + (countp * countt) % 1000000007) % 1000000007; } cout << result; return 0; }