题意:
给一个只包含大写字母的字符串,求其中有多少个ABA(不一定连续)
举个栗子: ABBBA
这个样例有3个ABA
样例:
输入:
YARBRBAQ
TYAYBATTBLBZA
输出
2
6
思路:
可以先把字符串中的A B
取出,按原序放到一个新数组str[ ]
中,
然后依次预处理,A
的数量,AB
的数量,ABA
的数量,我们可以开三个数组来处理他们,
da[ ]
,dab[]
,daba[]
,最终存ABA
数量的数组可以由之前两个推出
参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include <cstdio> #include <algorithm> #include <vector> #include <iostream> #include <map> #include <queue> #include <set> #include <cstring> #include <string> #include <cstdlib> #include <cmath> using namespace std; const int inf = 1 << 30; const int maxn = 1e6 + 5; typedef long long ll; //const int N = 5005; typedef unsigned long long ull; char s[maxn], str[maxn]; ll da[maxn], dab[maxn], daba[maxn]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> s + 1; ll n = strlen(s + 1); ll cnt = 0; for (int i = 1; i <= n; i++) { if (s[i] == 'A' || s[i] == 'B') str[++cnt] = s[i]; } for (int i = 1; i <= cnt; i++) { if (str[i] == 'A') da[i] = da[i - 1] + 1; else da[i] = da[i - 1]; } for (int i = 1; i <= cnt; i++) { if (str[i] == 'B') dab[i] = dab[i - 1] + da[i]; else dab[i] = dab[i - 1]; } for (int i = 1; i <= cnt; i++) { if (str[i] == 'A') daba[i] = daba[i - 1] + dab[i]; else daba[i] = daba[i - 1]; } cout<<daba[cnt]<<endl; }
|