|
发表于 2023-8-20 20:09:33
|
显示全部楼层
首先,我们要从 S 中选字符组成一个回文串,求最大长度。
那么回文串的性质是什么呢,就是回文串的定义,如果记回文串 S 的长度为 N,即每一个 S_i 都与 S_N-i+1 相同,或者每一个 S_i 一定有另外一个相等的字符配对。
既然是 2 个,那么就是,只要是一堆偶数个字符,一定可以组成一个回文串。
也就是说,我们只要在 S 中选取那些有偶数个字符的字符即可。
那么奇数呢?奇数也不能浪费,因为奇数也可以拆分成一个偶数和一个 1,而这个 1,虽然小,但他也能影响答案,回文串的长度可以为奇数,这个 ‘1’ 也就相当于插在了串的中间。
所以,我们的总体思路就是,每次尽可能多的在 S 中选择两个相同的字符累加答案,然后如果有奇数的话,只加一个即可。
代码:
- #include <bits/stdc++.h>
- using namespace std;
- int n, x, res, have;
- char s[200002];
- unordered_map<int, int> cnt;
- int main() {
- scanf("%s", s + 1);
- n = strlen(s + 1);
- for (int i = 1; i <= n; ++i) {
- ++cnt[s[i]];
- }
- for (auto i : cnt) {
- res += i.second / 2 * 2;
- have |= i.second % 2;
- }
- printf("%d\n", res + have);
- return 0;
- }
复制代码 |
|