社区讨论

WAon test 2# 求调

CF2145CMonocarp's String参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mj5gras3
此快照首次捕获于
2025/12/14 16:29
2 个月前
此快照最后确认于
2025/12/17 17:30
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;
#define ll long long
#define ull unsigned long long
#define db double
#define sz(x) ((int)x.size())
#define inf (1 << 30)
#define pb push_back
typedef pair<int, int> PII;
const int N = 2e5 + 7;
const int P = 998244353;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!(ch >= '0' && ch <= '9')) {if (ch == '-') f = -f;ch = getchar();}
  while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0';ch = getchar();}
  return x * f;
}
char s[N];
int sum[N], suf[N], n;
void solve() {
  map <int, set<int> > mp;
  mp.clear();
  // n = read();
  scanf("%d%s", &n, s + 1);
  for (int i = 1; i <= n; i++) {
    sum[i] = sum[i - 1] + (s[i] == 'a' ? 1 : -1);
  }
  for (int i = n; i >= 1; i--) {
    suf[i] = suf[i + 1] + (s[i] == 'a' ? 1 : -1);
    mp[suf[i]].insert(i);
  }
  if(suf[1] == 0){
		printf("%d\n", 0);
		return;
	}
  // for (int i = 1; i <= n; i++) {
  //   printf("%d : %d\n", suf[i], sum[i]);
  // }
  // mp[0].insert(n + 1);
  int ans = n;
  for (int i = 0; i <= n; i++) {
    auto p = mp[-sum[i]].upper_bound(i);
    if (p != mp[-sum[i]].end()) {
      int x = *p;
      ans = min(ans, x - i - 1);
    }
  }
  printf("%d\n", ans == n ? -1 : ans);
}

int main() {
  int T;
  scanf("%d", &T);
  while (T--) solve();
  return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...