1 solutions

  • 0
    @ 2023-10-31 20:17:55

    对于任意一个位置 i ,根据其字符与其前一个字符是否相同来统计子串数量。这样的思路来源于题目给出的两个转换规则——对于子串 0110 ,我们可以通过一次操作将其长度减少。因此,只要字符串 s[i] 与其前一个字符 s[i-1] 不同,那么从开头到当前位置的子串都可以满足题目的要求。

    对于每一个位置 i: 如果这不是第一个字符且 s[i]s[i-1] 是不同的(即形成了 0110 这样的子串),那么所有从字符串起始到当前位置的子串都可以满足题目的要求。所以我们将答案增加 i+1

    例如,对于字符串 100,当我们考虑第3个字符时,我们有以下满足条件的子串:1, 0, 0, 10, 001,共5个。

    如果 s[i]s[i-1] 是相同的,那么只有一个字符的子串满足条件,因此答案增加1。

    这个算法的关键思路是根据连续的 0110 来计算可以被转换的子串数量。连续的相同字符(如 0011)只能计算为一个满足条件的子串。这种方法确保了计算的高效性和准确性,而不需要遍历所有可能的子串来检查它们是否满足条件。

    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