题目:

题目描述

作为一只明媚的兔子,需要学会叠被子…
被子是方形的,上面有很多小写字母.可以认为被子是一个n*m的字符矩阵
被子能够被叠起来,当且仅当每一行,每一列都是回文串.
兔子可以把同一条被子上任意两个位置的字母交换位置,而且兔子不嫌麻烦,为了把被子叠起来它愿意交换任意多次.但是兔子不能交换两条不同的被子之间的字母.
现在兔子翻箱倒柜找出来了很多被子,请你帮兔子判断每条被子能否被叠起来.

输入

第一行一个Q,表示被子的条数
接下来描述Q条被子.
描述每条被子时,第一行输入两个整数n,m表示由n行m列组成
接下来n行每行一个长度为m的字符串.字符串中只含小写字母.

输出

Q行,依次输出对每条被子的判断结果.如果可以叠起来,输出一行“Yes”(不包括引号),如果叠不起来,输出一行“No”(不包括引号).

样例输入

53 4
aabb
aabb
aacc2 2
aa
bb5 1
t
w
e
e
t2 5
abxba
abyba1 1
z

样例输出

Yes
No
Yes
No
Yes

提示

Q<=10,n,m<=200Q


思路:

  发现对于两个都是偶数的来说,因为每行每列都要对称,那么每个字符出现的次数都应该是4的倍数。

  对于一奇一偶的情况,只有奇中间那一行可以是%4 余 2的。因为中间那一串自己成为一个回文串即可。当然出现奇数次数的不行。同时余2的个数必须要<列/2(如果列为偶的话,其他反之)。

  对于两个都是奇数的情况,允许一个奇数出现,拿一个作为中间那一个。其他余2的次数不能超过n−1+m−12\frac{n - 1 + m - 1}{2}。

  特判即可。


实现:

#include <cstdio>
#include <cstring>
int cnt[30], mod[4];
char s[207];
void init(int n, int m) {memset(cnt, 0, sizeof(cnt));memset(mod, 0, sizeof(mod));for (int i = 0; i < n; i++) {scanf("%s", s);for (int j = 0; j < m; j++) cnt[s[j] - 'a']++;}for (int i = 0; i < 26; i++) mod[cnt[i] % 4]++;
}
bool solve(int n, int m) {mod[1] += mod[3], mod[2] += mod[3];int tmp = (n & 1) + (m & 1);if (tmp == 0) return !(mod[1] || mod[2]);else if (tmp == 1) {if (mod[1]) return false;tmp = (n & 1) ? m / 2 : n / 2;return mod[2] <= tmp;} else {if (mod[1] != 1) return false;return mod[2] <= (n + m - 2) / 2;}
}
int main() {
//    freopen("in.txt", "r", stdin);int _, n, m; scanf("%d", &_);while (_--) {scanf("%d%d", &n, &m);init(n, m);puts(solve(n, m) ? "Yes" : "No");}return 0;
}

UPCOJ-5344 - 被子 - 瞎搞相关推荐

  1. [JZOJ5281]钦点题解--瞎搞+链表

    [JZOJ5281]钦点题解--瞎搞+链表 题目链接 于 暴 力 过 分析 第一眼: 模拟美滋滋?! 然后数据范围...不太对 naiive模拟30pts 然后你交换字符串指针60pts 然后发现可以 ...

  2. android重置系统,安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了!...

    安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了! 现在手机的价格逐渐的开始上升,一部好一点的手机价格还是比较贵的,所以很多人想要节省更多的换机支出,都会想要购买到一款可以使用的比较久的手机 ...

  3. HDU5971【瞎搞】

    题意:略(忙着准备文化课...明天期中考啊.... 思路: 正解就是染色,2-sat搞: AC代码(虽然是错误的...数据水(过踏马的也行啊,起码打脸他啊!) 4 3 1 0 1 2 2 3 3 4 ...

  4. HDU 5600(瞎搞)

    第一场Bestcoder居然爆零..果然是too naive..小聪明全部直接输出"YES"过了pretest,结果被叉也是&%$% 找到规律传递下就好.后来看官方题解感觉 ...

  5. HDU 4923 Room and Moor(瞎搞题)

    瞎搞题啊.找出1 1 0 0这样的序列,然后存起来,这样的情况下最好的选择是1的个数除以这段的总和. 然后从前向后扫一遍.变扫边进行合并.每次合并.合并的是他的前驱.这样到最后从t-1找出的那条链就是 ...

  6. 别再瞎搞数仓了!BAT内部大神:数据仓库不是谁都可以建的

    在我没有进互联网之前,我一直以为数据仓库是所有企业进行数据资产管理的必备工作,但直到我去了很多家企业搞数据之后才发现,原来并不是所有的企业都适合做数据仓库,更不要说数据中台了. 很多企业现在做数据仓库 ...

  7. Wannafly交流赛1: C. 腰带图(瞎搞)

    链接:https://www.nowcoder.com/acm/contest/69/C 来源:牛客网 题目描述 一个n个点m条边的无向图,它若满足以下性质,我们就称它为腰带图: 1.n为>=6 ...

  8. 我的瞎搞开发工具集以及对一些工具的比较

    本文的目的是作为一个记录,不引战,同时为有同样瞎搞爱好者提供一个学习思路--尽量全部推荐和使用免费开源工具,减少版权纠纷,降低学习成本,大概算有用吧 我的技术栈: 实际上有很多并不是很熟,请酌情参考 ...

  9. 使用jsdelivr时不要瞎搞

    8月15日jsdelivr在官网更新了使用条款.虽然不清楚具体更新了哪些内容,但是注意到这几个处被很多人忽略了.瞎搞很容易被jsdelivr阻断连接.以下是需要注意的这几个处. 4. Prohibit ...

  10. ubuntu--基础环境瞎搞集合

    安装ubuntu系统后有很多东西需要自己瞎搞一下,这里把一些瞎搞的过程记录在这里,方便以后重新装系统后重新配置. 一.安装. 可以在windows下制作启动盘(软碟通),然后开机u盘启动即可安装,预留 ...

最新文章

  1. 借助可视化,最直观理解梯度,以及偏导数、方向导数和法向量等
  2. ThinkPHP简单的基础
  3. HTML 标签自定义属性
  4. 厌倦了SWT TABLE,何不试试KTABLE?
  5. VTK:网格之CellEdges
  6. 为Ubuntu安装FTP服务
  7. 【Redis学习】Redis管理命令总结
  8. 以容器为代表的云原生技术,正成为释放云价值最短路径
  9. SAP License:利润中心设计思路
  10. AD的备份与标准还原:深入浅出Active Directory系列(四)
  11. spring boot 教程(四) 统一异常处理
  12. javascript html注释,javascript html注释
  13. 计算机ps基础知识教案范文,ps基础教案
  14. 朴素贝叶斯之邮件分类
  15. from_tensor_slices
  16. office精英俱乐部_开放组织读书俱乐部:收回精英制
  17. mysql 复制frm_通过拷贝frm myd myi opt文件来实现mysql的备份和还原
  18. 华为+android+root权限获取root,[Android]如何获取华为手机的root权限
  19. 徐无忌MySQL笔记:MySQL数据库锁有几种?实现原理是什么?
  20. ipoo3可以用鸿蒙,真正全网通!iQOO 3支持双模六频5G,出国也能用

热门文章

  1. 部署点评Cat监控项目
  2. 【Linux CentOS系统】Matplotlib不显示Times New Roman
  3. 7-6 厘米换算英尺英寸 (15 分)
  4. 学计算机r7000和y7000哪个好,联想拯救者r7000p和y7000p哪个好-联想拯救者r7000p和y7000p评测对比...
  5. ZOOMIT的使用方法
  6. UVM糖果爱好者教程 - 31.provides_responses?
  7. 【字节前端青训营】跟着月影学JavaScript——前端代码优化三大原则之各司其职,夜间模式小案例
  8. cc2530:<3>ADC采集光照度案例
  9. Pytorch Tutorial 学习笔记(六)模型部署
  10. 360校招笔试题总结4