题目链接:http://codeforces.com/problemset/problem/883/H

Time limit: 3000 ms

Memory limit: 262144 kB

Kolya has a string s of length n consisting of lowercase and uppercase Latin letters and digits.

He wants to rearrange the symbols in s and cut it into the minimum number of parts so that each part is a palindrome and all parts have the same lengths. A palindrome is a string which reads the same backward as forward, such as madam or racecar.

Your task is to help Kolya and determine the minimum number of palindromes of equal lengths to cut s into, if it is allowed to rearrange letters in s before cuttings.

Input

The first line contains an integer n (1 ≤ n ≤ 4·105) — the length of string s.

The second line contains a string s of length n consisting of lowercase and uppercase Latin letters and digits.

Output

Print to the first line an integer k — minimum number of palindromes into which you can cut a given string.

Print to the second line k strings — the palindromes themselves. Separate them by a space. You are allowed to print palindromes in arbitrary order. All of them should have the same length.

Example

Input
6
aabaac
Output
2
aba aca
Input
8
0rTrT022
Output
1
02TrrT20
Input
2
aA
Output
2
a A

题意:

给出一个长度为n的字符串,可以任意的重新排列,求最小能将该字符串切割成等长的多少份,使得每一份均为回文串。

题解:

(引用来自http://blog.csdn.net/mMingfunnyTree/article/details/78306596的思路。)

不难想到,记录下每个字符出现的次数,要么是出现奇数次,要么是出现偶数次,记为cnt[i]。

假设长度为n的字符串,切割成m份,每份长为len(即 m * len = n),那么显然,len要么是奇数,要么是偶数;

若len为偶数,根据回文串的性质,就会推出 所有字符出现的次数都为偶数;

换句话说,一旦cnt[ '0'~'9' & 'a'~'z' & 'A'~'Z' ]中任意一个cnt[i]为奇数,len就必须为奇数;

那么我们先把情况分成两种:

  所有cnt[i]均为偶数,这时len可以为偶数,而要m最小,显然此时m可以为1,len==n;

  把字符串调整为回文串输出即可。

  存在一些cnt[i]为奇数,这时len必须为奇数,根据奇数长度的回文串的性质可知:

  每个回文串,中间位置单独一个字符;剩余均为成对出现的字符;

  例如"aabbbaa":单独一个字符'b';成对出现字符'a','a','b';

  这样我们就不难想到一种思路:

    遍历 '0'~'9' & 'a'~'z' & 'A'~'Z',根据cnt[i]的奇偶性,分成两组:odd和even;

    odd集合中每个元素代表一个成单的字符;even集合中每个元素代表一对成双的字符;

    这样一来,目标情况是:

    odd集合的size正好为m,这样odd内的每个元素正好作为一个回文小串的中间位,

    而even集合中的元素应当正好可以平均分配到m个回文小串中( 即满足m | even.size()  <=>  odd.size() | even.size() );

    那如果even.size()不能平均分成m份怎么办?

    此时,显然只能把even中的一个元素,即一对字符,拆开来,当做两个成单字符;即even.size() -= 1 , m += 2;

    反复如此,直到even中的元素可以平均分配成m份为止(even.size()==0时必然可以平均分配,此时m = odd.size() = n );

AC代码:

#include<bits/stdc++.h>
#define MAX 400005
using namespace std;
int n;
char str[MAX];
int cnt[]={};
vector<char> odd,even;
int main()
{
scanf("%d",&n);
scanf("%s",&str);
for(int i=;i<n;i++) cnt[str[i]]++;
for(int i='';i<='z';i++)
{
if(cnt[i]<=) continue;
if(cnt[i]%)
{
odd.push_back((char)i);
cnt[i]--;
}
while(cnt[i])
{
even.push_back(i);
cnt[i]-=;
}
} char ans[MAX];
if(odd.empty())
{
printf("1\n");
for(int i=;i<n/;i++) ans[i]=ans[n--i]=even[i];
ans[n]='\0';
printf("%s\n",ans);
return ;
} while(even.size() % odd.size())
{
odd.push_back(even.back());
odd.push_back(even.back());
even.pop_back();
} printf("%d\n",odd.size());
int len=n/odd.size();
while(!odd.empty())
{
ans[len/]=odd.back();
odd.pop_back();
for(int j=;j<len/;j++)
{
ans[j]=ans[len--j]=even.back();
even.pop_back();
}
ans[len]='\0';
printf("%s ",ans);
}
}

codeforces 883H - Palindromic Cut - [字符串处理]的更多相关文章

  1. 883H - Palindromic Cut(思维+STL)

    题目链接:http://codeforces.com/problemset/problem/883/H 题目大意:给一段长度为n的字符串s,想让你把s切成几段长度相同的回文串,可以改变s中字符的排列, ...

  2. CodeForces 835D - Palindromic characteristics | Codeforces Round #427 (Div. 2)

    证明在Tutorial的评论版里 /* CodeForces 835D - Palindromic characteristics [ 分析,DP ] | Codeforces Round #427 ...

  3. cut字符串截取

    cut字符串截取 -d 按字节截取 [root@slave elk]# ll total 0 drwxr-xr-x. 6 root root 194 Jan 24 16:15 bigdesk 截取前2 ...

  4. CodeForces 176B Word Cut dp

    Word Cut 题目连接: http://codeforces.com/problemset/problem/176/C Description Let's consider one interes ...

  5. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  6. CodeForces 176B Word Cut (计数DP)

    Word Cut Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  7. Longest Palindromic Substring - 字符串中最长的回文字段

    需求:Given a string S, find the longest palindromic substring in S. You may assume that the maximum le ...

  8. Codeforces 316G3 Good Substrings 字符串 SAM

    原文链接http://www.cnblogs.com/zhouzhendong/p/9010851.html 题目传送门 - Codeforces 316G3 题意 给定一个母串$s$,问母串$s$有 ...

  9. Codeforces 1090B - LaTeX Expert - [字符串模拟][2018-2019 Russia Open High School Programming Contest Problem B]

    题目链接:https://codeforces.com/contest/1090/problem/B Examplesstandard input The most famous characters ...

随机推荐

  1. 7 -- Spring的基本用法 -- 10... 获取其他Bean的属性值;获取Field值;获取任意方法的返回值

    7.10 高级依赖关系配置 组件与组件之间的耦合,采用依赖注入管理:但基本类型的成员变量值,应直接在代码中设置. Spring支持将任意方法的返回值.类或对象的Field值.其他Bean的getter ...

  2. switch和continue的关系

    突然想到 我们用 switch都是用 break return等关键字来配合,有没有一种情况下是用continue呢?而且如果真的出现了continue,结果是什么样的呢?

  3. EhCache初体验

    一.简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存 ...

  4. 《C++ Primer Plus》16.1 string类 学习笔记

    16.1.1 构造字符串程序清单16.1使用了string的7个构造函数.程序清单16.1 str1.cpp---------------------------------------------- ...

  5. php_admin_value open_basedir 引起的上传文件失败解决方法

    为了安全,我们通常会在虚拟主机设置中,加入这一行php_admin_value open_basedir "/usr/local/apache/htdocs/www"但这会导致mo ...

  6. Subversion权限详解

    1   背景假设厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式有 ...

  7. open-falcon之query

    功能 query组件,提供统一的绘图数据查询入口.query组件接收查询请求,根据一致性哈希算法去相应的graph实例查询不同metric的数据,然后汇总拿到的数据,最后统一返回给用户. 配置文件 { ...

  8. thinkphp3.2 实现留言功能

    写一个例子说明一下: 前端:http://www.mmkb.com/zhendao/index/feedback.html <form method="post" actio ...

  9. HDFS的客户端操作

    命令行操作: -help      功能:输出这个命令参数手册 -ls                   功能:显示目录信息 示例: hadoop fs -ls hdfs://hadoop-serv ...

  10. Mobx与Redux区别

    Mobx的实现思想和Vue几乎一样,所以其优点跟Vue也差不多:通过监听数据(对象.数组)的属性变化,可以通过直接在数据上更改就能触发UI的渲染,从而做到MVVM.响应式.上手成本低.开发效率高,在数 ...