[Code Festival 2017 qual A] C: Palindromic Matrix
题意
给出一个小写字母组成的字符矩阵,问能否通过重排其中的字符使得每行每列都是回文串.
分析
简化版:给出一个字符串,问能否通过重排其中的字符使得它是回文串.那么如果字符串长度为偶数,就需要a到z的个数都是2的倍数,如果长度是奇数,就需要恰好有一种字母的个数不是2的倍数.
那么拓展到二维的情况也差不多.
假设行数为n,列数为m.
1.n和m均为偶数:
最简单的情况,只需要所有字母的个数都是4的倍数
2.n为偶数,m为奇数:(n为奇数m为偶数的情况相同)
那么在刨掉一个长度为n的回文串之后所有字母的个数都是4的倍数.
于是所有字母的个数还都得是偶数,我们不妨先把所有字母的个数都除以2...
那么除以2之后要有(m-1)n/2个字母可以分成两两一组,还有n/2个字母可以分成每个字母单独一组...
于是数一数除以2之后有多少个字母是奇数个,如果这个数目大于n/2那么没戏,如果这个数目和n/2的奇偶性不同也没戏,否则一定行.
3.n为奇数,m为奇数
首先必然会有一种字母是奇数个,其他字母是偶数个,不满足这个条件就GG了.
如果满足这个条件,为了简化问题再把所有字母个数除以2...
那么还要有(m-1)(n-1)/2个字母可以两两一组,(n-1)/2+(m-1)/2个字母可以每个字母单独一组,然后的判断和2相同.
打比赛的时候中途走神这题50分钟才过
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
int cnt[30];
int main(){
scanf("%d%d",&n,&m);
int N=n*m;
char ch;
for(int i=1;i<=N;++i){
while(ch=getchar(),ch>'z'||ch<'a');
cnt[ch-'a']++;
}
if(n%2==0&&m%2==0){
bool flag=true;
for(int i=0;i<26;++i)if(cnt[i]%4!=0)flag=false;
printf("%s\n",flag?"Yes":"No");
}else if(n%2==0||m%2==0){
if(m%2==0)swap(n,m);
//n even m odd
// 4*((m-1)*n/4),2*(n/2)
bool flag=true;
for(int i=0;i<26;++i){
if(cnt[i]&1)flag=false;
}
// 2*((m-1)*n/4),1*(n/2)
for(int i=0;i<26;++i)cnt[i]/=2;
int cnt2=0,cnt1=0;
for(int i=0;i<26;++i)cnt2+=cnt[i]/2,cnt1+=cnt[i]&1;
if(cnt1>n/2||(cnt1&1)!=((n/2)&1))flag=false;
printf("%s\n",flag?"Yes":"No");
}else{
//n odd m odd
// 4*[(n-1)*(m-1)/4] 2*[(n-1)/2 +(m-1)/2] 1*1
int cnt1=0;
for(int i=0;i<26;++i){
if(cnt[i]&1)cnt1++;
}
bool flag=true;
if(cnt1!=1){
flag=false;
}else{
for(int i=0;i<26;++i){
cnt[i]/=2;
}//2*[(n-1)*(m-1)/4] 1*[(n-1)/2 +(m-1)/2]
cnt1=0;
for(int i=0;i<26;++i){
if(cnt[i]&1)cnt1++;
}
if(cnt1>(n-1)/2+(m-1)/2||((cnt1&1)!=(((n-1)/2 +(m-1)/2)&1)))flag=false;
}
printf("%s\n",flag?"Yes":"No");
}
return 0;
}
[Code Festival 2017 qual A] C: Palindromic Matrix的更多相关文章
- CODE FESTIVAL 2017 qual A C Palindromic Matrix(补题)
彩笔看到题目后,除了懵逼,没有啥反应了,唯一想的就是 这是不是dp啊?看了题解才发现,原来是这样啊. 画几个矩阵看看就能看出来规律. 思路:先假设这是个M * N的矩阵 如果M和N都是偶数,则每个出现 ...
- CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】
CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...
- CODE FESTIVAL 2017 qual B C - 3 Steps【二分图】
CODE FESTIVAL 2017 qual B C - 3 Steps 题意:给定一个n个结点m条边的无向图,若两点间走三步可以到,那么两点间可以直接连一条边,已经有边的不能连,问一共最多能连多少 ...
- 【AtCoder】CODE FESTIVAL 2017 qual A
A - Snuke's favorite YAKINIKU -- #include <bits/stdc++.h> #define fi first #define se second # ...
- CODE FESTIVAL 2017 qual A 题解
补一发A的题解. A - Snuke's favorite YAKINIKU 题意: 输入字符串S,如果以YAKI开头输出Yes,否则输出No. #include<bits/stdc++.h&g ...
- CODE FESTIVAL 2017 qual A--C - Palindromic Matrix(模拟所有情况,注意细节)
个人心得:其实本来这题是有规律的不过当时已经将整个模拟过程都构思出来了,就打算试试,将每个字符和总和用优先队列 装起来,然后枚举每个点,同时进行位置标志,此时需要多少个点的时候拿出最大的和出来,若不满 ...
- CODE FESTIVAL 2017 qual B
昨晚因为有点事就去忙了,没打后悔啊 A - XXFESTIVAL Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem ...
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
蒟蒻__stdcall终于更新博客辣~ 一下午+一晚上=一道计数题QAQ 为什么计数题都这么玄学啊QAQ Prelude 题目链接:这里是传送门= ̄ω ̄= 下面我将分几个步骤讲一下这个题的做法,大家不 ...
- Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分
题目链接 题意 给定一个字符串(长度\(\leq 2e5\)),将其划分成尽量少的段,使得每段内重新排列后可以成为一个回文串. 题解 分析 每段内重新排列后是一个回文串\(\rightarrow\)该 ...
随机推荐
- Maven学习(十)-----使用Maven创建Java项目
所需要的工具: Maven 3.3.3 Eclipse 4.2 JDK 8 注意:请确保 Maven 是正确安装和配置(在Windows,*nix,Mac OSX系统中),然后再开始本教程,避免 mv ...
- javaweb总结(四十)——编写自己的JDBC框架
一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...
- javaweb(三十九)——数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- 五、利用EnterpriseFrameWork快速开发基于WebServices的接口
回<[开源]EnterpriseFrameWork框架系列文章索引> EnterpriseFrameWork框架实例源代码下载: 实例下载 前面几章已完成EnterpriseFrameWo ...
- Centos安装Python3(自带pip和setuptools)
安装zlib相关依赖 解决zipimport.ZipImportError: can't decompress data和pip3 ssl证书问题 sudo yum -y install zlib* ...
- Hyperledger Fabric CouchDB as the State Database——使用CouchDB
使用CouchDB作为状态数据库 状态数据库选项 状态数据库包括LevelDB和CouchDB.LevelDB是嵌入在peer进程中的默认键/值状态数据库,CouchDB是一个可选的外部状态数据库.与 ...
- lxd&openstack-lxd源码剖析
lxd:https://linuxcontainers.org/lxd/,目标是融入到openstack体系被管理,像虚拟机一样被管理使用.从如下图可知,并非走的是libvirt-lxc路线,而是no ...
- openstack golang sdk使用
1. go get github.com/gophercloud/gophercloud import ( "github.com/gophercloud/gophercloud" ...
- Beautiful Year(拆分四位数)
Description It seems like the year of 2013 came only yesterday. Do you know a curious fact? The year ...
- 20172305 2018-2019-1 《Java软件结构与数据结构》第九周学习总结
20172305 2018-2019-1 <Java软件结构与数据结构>第九周学习总结 教材学习内容总结 本周内容主要为书第十五章内容: 图(结点和结点之间的连接构成) 顶点:结点 边:结 ...