题意

给出一个小写字母组成的字符矩阵,问能否通过重排其中的字符使得每行每列都是回文串.

分析

简化版:给出一个字符串,问能否通过重排其中的字符使得它是回文串.那么如果字符串长度为偶数,就需要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的更多相关文章

  1. CODE FESTIVAL 2017 qual A C Palindromic Matrix(补题)

    彩笔看到题目后,除了懵逼,没有啥反应了,唯一想的就是 这是不是dp啊?看了题解才发现,原来是这样啊. 画几个矩阵看看就能看出来规律. 思路:先假设这是个M * N的矩阵 如果M和N都是偶数,则每个出现 ...

  2. CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】

    CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...

  3. CODE FESTIVAL 2017 qual B C - 3 Steps【二分图】

    CODE FESTIVAL 2017 qual B C - 3 Steps 题意:给定一个n个结点m条边的无向图,若两点间走三步可以到,那么两点间可以直接连一条边,已经有边的不能连,问一共最多能连多少 ...

  4. 【AtCoder】CODE FESTIVAL 2017 qual A

    A - Snuke's favorite YAKINIKU -- #include <bits/stdc++.h> #define fi first #define se second # ...

  5. CODE FESTIVAL 2017 qual A 题解

    补一发A的题解. A - Snuke's favorite YAKINIKU 题意: 输入字符串S,如果以YAKI开头输出Yes,否则输出No. #include<bits/stdc++.h&g ...

  6. CODE FESTIVAL 2017 qual A--C - Palindromic Matrix(模拟所有情况,注意细节)

    个人心得:其实本来这题是有规律的不过当时已经将整个模拟过程都构思出来了,就打算试试,将每个字符和总和用优先队列 装起来,然后枚举每个点,同时进行位置标志,此时需要多少个点的时候拿出最大的和出来,若不满 ...

  7. CODE FESTIVAL 2017 qual B

    昨晚因为有点事就去忙了,没打后悔啊 A - XXFESTIVAL Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem ...

  8. 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数

    蒟蒻__stdcall终于更新博客辣~ 一下午+一晚上=一道计数题QAQ 为什么计数题都这么玄学啊QAQ Prelude 题目链接:这里是传送门= ̄ω ̄= 下面我将分几个步骤讲一下这个题的做法,大家不 ...

  9. Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分

    题目链接 题意 给定一个字符串(长度\(\leq 2e5\)),将其划分成尽量少的段,使得每段内重新排列后可以成为一个回文串. 题解 分析 每段内重新排列后是一个回文串\(\rightarrow\)该 ...

随机推荐

  1. C语言复习20170716

    C语言复习20170716 C数据类型 图片来自:C语言基本数据类型简介 C语言程序处理的数据有常量和变量两种形式. 常量是在程序中不能改变其值的量.例如:整型常量.实型常量.字符常量.字符串常量和枚 ...

  2. 20155333 2016-2017-2《Java程序设计》课程总结

    20155333 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:你期望的师生关系是什么? 预备作业2:体会做中学(Learing By Doi ...

  3. 3-3 修改haproxy配置文件

    1.需求 2.个人思路 3.个人心得 4.

  4. day5 二值化

    1.otsu二值化 # coding=utf-8 import cv2 import numpy as np from matplotlib import pyplot as plt #1.读入图像 ...

  5. 通知的多线程问题 iOS

    发送通知在子线程,接受也在子线程.如果子线程操作UI,会打印一推日志,告诉我们应该主线程操作.

  6. XAF-如何修改内置的编辑器(Property Editor)

    本示例演示在web/win中给 日期选择控制显示出一个时钟及修改时间的控件.效果如下: 如果你装了XAF在这个路径中已经有了这个示例: %PUBLIC%\Documents\DevExpress De ...

  7. textbox的验证

    代码如下: textBox1.KeyDown += (a, b) => { if (b.KeyCode == Keys.Enter) { textBox2.Focus(); } }; textB ...

  8. VIN码/车架号的详解,车架号识别,VIN码识别,OCR车架号识别能带来什么

    各位车主在车检时不知道有没有注意到一件事,就是工作人员会打开车前盖在前围钢板上拓一张条码.下面来给大家介绍一下,这张条码就是VIN号,俗称钢印号,就像我们每个人都有自己的身份证号码一样,这也是汽车界的 ...

  9. Scrapy爬豆瓣电影Top250并存入MySQL数据库

    d:进入D盘 scrapy startproject douban创建豆瓣项目 cd douban进入项目 scrapy genspider douban_spider movie.douban.co ...

  10. 测试类异常Manual close is not allowed over a Spring managed SqlSession

    在用Spring 和mybatis整合的 写测试类的时候报出解决办法:在全局配置文件   class="org.mybatis.spring.SqlSessionTemplate" ...