查看原题请戳这里
思路 我们可以对读入的字符串s
任意排序,但是实际上我们并没有必要对s
进行排序——aabbaa
和baaaab
其实对于这道题来讲是一样的。 我们可以发现,对于数量为偶数的字母,我们将其中的偶数个分别添加到某个回文串的两侧,这样就可以得到一个更长的回文串。而且,每个回文串中至多有一个字母在本回文串的个数为1
。这就意味着,若数量为奇数的字母有n
个,则我们至少需要把s
分成n
个回文串。 因此,奇数影响着回文串的个数,偶数影响回文串的长度。所以,我们只需要记录每一个字母的出现次数即可。
代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #define ll long long #define INF 0x7fffffff #define re register using namespace std ;int read () { register int x = 0 ,f = 1 ;register char ch; ch = getchar(); while (ch > '9' || ch < '0' ){if (ch == '-' ) f = -f;ch = getchar();} while (ch <= '9' && ch >= '0' ){x = x * 10 + ch - 48 ;ch = getchar();} return x * f; } char s[1000005 ]; int t[100 ],j,o;int main () { cin >> s; int l = strlen (s); for (int i = 0 ; i < l; i++) t[s[i] - 'a' + 1 ] ++; for (int i = 1 ; i <= 26 ; i++) { j = j + t[i] % 2 ; o = o + t[i] / 2 ; } int ans; if (j) ans = o / j * 2 + 1 ; else ans = o * 2 ; cout << ans << endl ; return 0 ; }