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';
}
}

浙公网安备 33010602011771号