1 solutions
-
0
对于任意一个位置
i
,根据其字符与其前一个字符是否相同来统计子串数量。这样的思路来源于题目给出的两个转换规则——对于子串01
或10
,我们可以通过一次操作将其长度减少。因此,只要字符串s[i]
与其前一个字符s[i-1]
不同,那么从开头到当前位置的子串都可以满足题目的要求。对于每一个位置
i
: 如果这不是第一个字符且s[i]
和s[i-1]
是不同的(即形成了01
或10
这样的子串),那么所有从字符串起始到当前位置的子串都可以满足题目的要求。所以我们将答案增加i+1
。例如,对于字符串
100
,当我们考虑第3个字符时,我们有以下满足条件的子串:1, 0, 0, 10, 001
,共5个。如果
s[i]
和s[i-1]
是相同的,那么只有一个字符的子串满足条件,因此答案增加1。这个算法的关键思路是根据连续的
01
或10
来计算可以被转换的子串数量。连续的相同字符(如00
或11
)只能计算为一个满足条件的子串。这种方法确保了计算的高效性和准确性,而不需要遍历所有可能的子串来检查它们是否满足条件。std
#include <bits/stdc++.h> #define int long long using i64 = long long; using u64 = unsigned long long; using i128 = __int128; void solve() { int n; std::cin >> n; std::string s; std::cin >> s; i64 ans = 0; for (int i = 0; i < n; i++) { if (i > 0 && s[i] != s[i - 1]) { ans += i + 1; } else { ans += 1; } } std::cout << ans << "\n"; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int T; std::cin >> T; while (T--) { solve(); } return 0; }
Information
- ID
- 6950
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 25
- Accepted
- 5
- Uploaded By