【CF1660F1】题解
Promising String (easy version) 题解
Promising String (easy version) 题目传送门
思路
求区间内 + 比 - 多的个数。考虑 $n \le 2000$,可以得出一个 $O(n^2)$ 的算法:两个指针枚举左端点和右端点,前缀和 $O(1)$ 求出区间内 - 比 + 多的个数。只能将 $2$ 个 - 换成 $1$ 个 +,而 $2 + 1 = 3$,所以只有 - 比 + 多的个数是 $3$ 的倍数这个子串才为平衡字符串。
时空复杂度分析
时间
前缀和 $O(n)$,枚举字串左右端点 $O(n^2)$,总时间 $O(n^2)$。
空间
前缀和数组 $O(n)$,总空间 $O(n)$。
Accepted Code
#include<iostream>
using namespace std;
const int MAXN = 3e3 + 10;
int t, n, sum[MAXN];
string s;
void Solve(){
cin >> n >> s;
sum[0] = s[0] == '-' ? 1 : -1;
for (int i = 1; i < n; i++){
sum[i] = sum[i - 1] + (s[i] == '-' ? 1 : -1);
}
long long ans = 0;
for (int i = 0; i < n; i++){
for (int j = i; j < n; j++){
ans += (sum[j] - sum[i - 1] >= 0 && (sum[j] - sum[i - 1]) % 3 == 0);
}
}
cout << ans << '\n';
}
int main(){
cin >> t;
while (t--){
Solve();
}
return 0;
}

浙公网安备 33010602011771号