CF1907C 题解

题意

对于字符串 \(s\),每次可以删掉相邻的两个不相同字母,求操作后的最短长度。

题解

发现答案与字符的排列顺序无关,因为一旦有不同就一定会被删掉,例如 \(aabac\)\(aaabc\) 发现他们是等价的。

所以统计字符集元素出现个数,若最大值小于 \(\left\lceil \frac{n}{2}\right\rceil\),一定可以删到剩余 \(n \mod 2\) 个,否则会剩余 \(mx - (n - mx)\) 个。

不难证明复杂度来源于统计最大值的 \(O(n)\)

#include<iostream>
#include<cstring>
int t, n, b[30]; std::string s;
int main(){
    std::cin >> t;
    while(t--){
        std::cin >> n >> s;
        memset(b, 0, sizeof b);
        for(int i = 0; i < n; i++)
            b[s[i] - 'a' + 1] ++;
        int rs = 0;
        for(int i = 1; i <= 26; i++)
            if(b[i] > rs) rs = b[i];
        if(rs <= (n + 1) / 2) std::cout << (n % 2) << '\n';
        else std::cout << rs * 2 - n << '\n';
    }
}
posted @ 2023-12-11 07:36  xlpg0713  阅读(22)  评论(0)    收藏  举报