【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

Accepted Record

#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;
}
posted @ 2023-09-15 18:37  rksm2333  阅读(19)  评论(0)    收藏  举报  来源