codeforces 883H - Palindromic Cut - [字符串处理]
题目链接: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
6
aabaac
2
aba aca
8
0rTrT022
1
02TrrT20
2
aA
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 - [字符串处理]的更多相关文章
- 883H - Palindromic Cut(思维+STL)
题目链接:http://codeforces.com/problemset/problem/883/H 题目大意:给一段长度为n的字符串s,想让你把s切成几段长度相同的回文串,可以改变s中字符的排列, ...
- CodeForces 835D - Palindromic characteristics | Codeforces Round #427 (Div. 2)
证明在Tutorial的评论版里 /* CodeForces 835D - Palindromic characteristics [ 分析,DP ] | Codeforces Round #427 ...
- cut字符串截取
cut字符串截取 -d 按字节截取 [root@slave elk]# ll total 0 drwxr-xr-x. 6 root root 194 Jan 24 16:15 bigdesk 截取前2 ...
- CodeForces 176B Word Cut dp
Word Cut 题目连接: http://codeforces.com/problemset/problem/176/C Description Let's consider one interes ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- Longest Palindromic Substring - 字符串中最长的回文字段
需求:Given a string S, find the longest palindromic substring in S. You may assume that the maximum le ...
- Codeforces 316G3 Good Substrings 字符串 SAM
原文链接http://www.cnblogs.com/zhouzhendong/p/9010851.html 题目传送门 - Codeforces 316G3 题意 给定一个母串$s$,问母串$s$有 ...
- 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 ...
随机推荐
- AES五种加密模式
分组密码在加密时明文分组的长度是固定的,而实用中待加密消息的数据量是不定的,数据格式可能是多种多样的.为了能在各种应用场合安全地使用分组密码,通常对不同的使用目的运用不同的工作模式. 一.电码本模式( ...
- Window关闭端口的方法(445/135/137/138/139/3389等)
为防止漏洞被利用,需要采取必要措施,关闭以上端口,以保证系统更加安全. window2003 关闭135端口的方法 要关闭此端口,只需停止DCOM接口服务即达到目的.下面是详细操作过程. 1.打开“组 ...
- Fragment切换问题
片断一: add hind @Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) { switch (check ...
- centos6.4搭建ftp服务器
在centos环境下搭建ftp服务器,选择用vsftpd. 1.检测是否已经安装vsftpd # rpm -qa | grep vsftpd 如果已经安装vsftpd,会显示相应版本号.没有任何提示, ...
- 微信公众号access_token的获取与存储
如果是一个用户触发,那么只要将access_token放在数据库,文件,nosql就行,取时判断时间是否过期,过期重新去微信获取再放入. 如果是很多用户,多进程并发,特别是分布式那种架构呢?进程A判断 ...
- No.4 PyQt学习(页面跳转)
先定义了两个MainWindow进行跳转,但发现这样的话,从第二个Window无法跳转会第一个.代码如下: # -*- coding: utf-8 -*- import sys from PyQt4. ...
- 基于链表的C语言堆内存检测
说明 本文基于链表实现C语言堆内存的检测机制,可检测内存泄露.越界和重复释放等操作问题. 本文仅提供即视代码层面的检测机制,不考虑编译链接级的注入或钩子.此外,该机制暂未考虑并发保护. 相关性文章参见 ...
- Androd Toolbar 的简单使用(转)
14年Android开发者大会提出了Android5.0 系统以及 材料设置 Material Design.在 材料设计中推出了大量的UI效果,其中某些功能 已添加进 兼容包,所以可以在低版本中来实 ...
- SQL SERVER 2008 R2安全配置与防暴力破解
https://blog.csdn.net/enweitech/article/details/49864215 0x00 sql server 2008 权限介绍 在访问sql server 200 ...
- Makefile 链接静态库
Linux的静态库是以.a结尾的,要连接静态库有两种方法,一种是在编译命令最后直接加上库路径/库名称. 例如你的库在绝对目录/lib/libtest.a下面你就可以这样来编译$(CC) $(CFLAG ...