Catalog
  1. 1. 思路
  2. 2. 代码
回文分割-题解

查看原题请戳这里

思路

我们可以对读入的字符串s任意排序,但是实际上我们并没有必要对s进行排序——aabbaabaaaab其实对于这道题来讲是一样的。
我们可以发现,对于数量为偶数的字母,我们将其中的偶数个分别添加到某个回文串的两侧,这样就可以得到一个更长的回文串。而且,每个回文串中至多有一个字母在本回文串的个数为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;
}
Author: wflight
Link: http://yoursite.com/2019/08/02/回文分割-题解/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付寶

Comment