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 ...
随机推荐
- 时间戳Id
ID:格式据1970.1.1毫秒数 1535091029740 13位 问题:高并发,分布式明显会有问题,网上有雪花算法,但是位数跟我需要的不一样,暂时不考虑,以后研究再用. 参考: https:/ ...
- iOS Runloop的超级讲解
这是目前看过的最好的一片中文讲解RunLoop的文章,推荐给大家看一下,原文链接:http://blog.ibireme.com/2015/05/18/runloop/ https://segment ...
- GC--垃圾收集器
把周末的文章放在现在才来写,是自己太忙了?还是堕落了? 好吧直接进入主题吧,简单干脆的理解会让自己记忆深刻: 首先说明:GC垃圾收集器关注两件事情: 第一件:查找所有存活对象. 第二件:抛弃死对象(不 ...
- Ubuntu下安装MySQL及简单操作
Ubuntu上安装MySQL非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client ...
- React Native汇错归纳(持续更新中……)
1.2017-10-25: 报错信息:“Cannot find entry file index.android.js in any of roots…..” 解决方法: 1.首先从虚拟机中找问题:看 ...
- 使用css制作倒影
-webkit-mask 这个属性是相当强大的,所以详细的介绍超出了本文的范畴,它非常值得深入研究,因为它可以在实际应用中为你省掉很多时间. -webkit-mask让为一个元素添加蒙板成为可能,从而 ...
- LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
解决方法 属性=>配置属性=>输入=>忽略特定库LIBCMT
- 向Windows内核驱动传递用户层定义的事件Event,并响应内核层的通知
完整的程序在下载:http://download.csdn.net/detail/dijkstar/7913249 用户层创建的事件Event是一个Handle句柄,和内核中的创建的内核模式下的KEV ...
- UVA 10120 - Gift?!(搜索+规律)
Problem D. Gift?! The Problem There is a beautiful river in a small village. N rocks are arranged ...
- MySQL使用查询结果生成临时表
MySQL中不支持对同一个表使用其查询结果更新or删除本表内数据(也就是update或delete后的where条件为针对相同表的select),解决方案是创建临时表做过度保存中间数据: 可以直接使用 ...