【题解】Sonya and Matrix Beauty [Codeforces1080E]

传送门:\(Sonya\) \(and\) \(Matrix\) \(Beauty\) \([CF1080E]\)

【题目描述】

\(Sonya\) 最近过了生日,她收到一个 \(n \times m\) 的字符矩阵。

我们称一个子矩阵是美丽的,当且仅当在重新排列这个子矩阵每一行的字符后,使得这个子矩阵的每一行每一列都是回文串。

\(Sonya\) 想要知道这个矩阵中有几个子矩阵是美丽的。

(给定一个 \(n \times m\) 的字符矩阵,求有多少个子矩阵在任意排列每一行内的字符后,使得子矩阵的每行每列都是回文串)

【样例】

样例输入:
1 3
aba
样例输出:
4 样例输入:
2 3
aca
aac
样例输出:
11 样例输入:
3 5
accac
aaaba
cccaa
样例输出:
43

【数据范围】

\(100\%\) \(1 \leqslant n,m \leqslant 250\)


【分析】

先膜一膜 隔壁大佬 \(Hash\) 判回文的方法,一脸懵逼的本蒟蒻只能另找出路了。。。

由于每一行的以内的字符可以任意排列,子矩阵中的某一行字符可以形成回文串,当且仅当该行中出现次数为奇数的字符只有一个。

如果让每一列都形成回文串的话,那么关于中心行对称的任意两行都应是完全相同的,否则就无法做到每一列都一样。

将子矩阵每一行视为一个字符,比较两个字符(行)是否相等时就看其 \(26\) 个字母的个数是否全部相同,对于内部本身无法形成回文的字符(行)就不让它与其他的匹配。

枚举一下子矩阵的左右边界,然后处理出 \(26\) 个字母在子矩阵每一行中分别出现的次数,然后对这 \(n\) 个字符(行)跑一遍 \(Manacher\) 得到上下边界,最后答案取个最大值就 \(ok\) 啦!

时间复杂度:\(O(nm^2)\) 。

【Code】

#include<cstdio>
#define Re register int
const int N=510;
int n,m,a,p,q,Ans,f[N],odd[N],cnt[N][30];char ch[N][N];
inline int min(Re a,Re b){return a<b?a:b;}
inline bool cmp(Re a,Re b){
if(odd[a]>1||odd[b]>1)return 0;//本身不能形成回文的统统踢掉
for(Re i=0;i<26;++i)if(cnt[a][i]!=cnt[b][i])return 0;
return 1;
}
int main(){
scanf("%d%d",&n,&m);
for(Re i=1;i<=n;++i)scanf("%s",ch[i]+1);
for(Re L=1;L<=m;++L){
for(Re i=0;i<=n;odd[2*i-1]=0,++i)
for(Re j=0;j<26;++j)
cnt[2*i-1][j]=0;//初始化
for(Re R=L;R<=m;++R){
for(Re i=1;i<=n;++i){//右边界从前往后扫,每次都只需要处理n个新加进来的字符
++cnt[2*i-1][a=ch[i][R]-'a'];
if(cnt[2*i-1][a]&1)++odd[2*i-1];
else --odd[2*i-1];
}
for(Re i=0;i<=2*n;++i)f[i]=0;//回文半径的初始化
cnt[2*n+1][0]=-1;//防止多余的部分被匹配
p=q=0;
for(Re i=1;i<=2*n;++i){
if(odd[i]>1)continue;//自身都不符合要求,还想找配偶?没门!
f[i]=q>i?min(f[(p<<1)-i],q-i):1;
while(cmp(i-f[i],i+f[i])==1)++f[i];
if(i+f[i]>q)q=(p=i)+f[i];
Ans+=f[i]/2;//因为之前在字符(行)序列中加入了空位置,所以统计答案时要除2
}
}
}
printf("%d",Ans);
}

【题解】Sonya and Matrix Beauty [Codeforces1080E]的更多相关文章

  1. Codeforces Round #524 (Div. 2) E. Sonya and Matrix Beauty(字符串哈希,马拉车)

    https://codeforces.com/contest/1080/problem/E 题意 有一个n*m(<=250)的字符矩阵,对于每个子矩阵的每一行可以任意交换字符的顺序,使得每一行每 ...

  2. Sonya and Matrix Beauty Codeforces - 1080E

    https://codeforces.com/contest/1080/problem/E 比赛时候一个多小时码不出来... 来看遇到的困难: 1.没有能用的随机unsignedlonglong函数 ...

  3. Sonya and Matrix Beauty CodeForces - 1080E (manacher)

    大意: 给定$nm$字符串矩阵. 若一个子矩形每一行重排后可以满足每行每列都是回文, 那么它为好矩形. 求所有好矩形个数. 一个矩形合法等价于每一行出现次数为奇数的最多只有一个字符, 并且对称的两行对 ...

  4. codeforces 495D Sonya and Matrix

    Since Sonya has just learned the basics of matrices, she decided to play with them a little bit. Son ...

  5. [题解]UVa 11082 Matrix Decompressing

    开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...

  6. Codeforces Round #495 (Div. 2) D. Sonya and Matrix

    http://codeforces.com/contest/1004/problem/D 题意: 在n×m的方格中,选定一个点(x,y)作为中心点,该点的值为0,其余点的值为点到中心点的曼哈顿距离. ...

  7. PAT甲题题解-1105. Spiral Matrix (25)-(模拟顺时针矩阵)

    题意:给定N,以及N个数.找出满足m*n=N且m>=n且m-n最小的m.n值,建立大小为m*n矩阵,将N个数从大到下顺时针填入矩阵中. #include <iostream> #in ...

  8. Sonya and Matrix CodeForces - 1004D (数学,构造)

    http://codeforces.com/contest/1004/problem/D 题意:网格图给定到中心点的曼哈顿距离数组, 求该图n,m及中心点位置 首先可以观察到距离最大值mx一定在某个角 ...

  9. Codeforces Round #495 (Div. 2) Sonya and Matrix

    正常没有正方形的限制下,值为i的点个数4i 那么从0开始遍历,第一个不为4i的值就是min(x, y) 由于对称性我们姑且令x为这个值 我们先列举n*m=t的各种情况 对于一对n, m.我们已经知道n ...

随机推荐

  1. c# 读数据库二进制流到图片

    public Bitmap PictureShow(string connectionString, string opName, string productType)        {       ...

  2. Linux从入门到精通总结(非原创)

    文章大纲 一.课程内容总结二.课程学习地址三.学习资料下载四.参考文章 一.课程内容总结   二.课程学习地址 第一天:https://www.cnblogs.com/WUXIAOCHANG/p/10 ...

  3. 虚拟机配置静态ip

    参考地址  https://www.cnblogs.com/maowenqiang/articles/7727910.html TYPE=EthernetBOOTPROTO="static& ...

  4. MySQLDump--导出数据脚本异常

    在一次使用mysqldump导出数据过程中,发现导出SQL无法正常执行,仔细观察后发下导出脚本为: (,,,,' Yimu(id:5085297)',''¥','[新教室V32] ',15593224 ...

  5. Xpath re bs4 等爬虫解析器的性能比较

    xpath re bs4 等爬虫解析器的性能比较 本文原始地址:https://sitoi.cn/posts/23470.html 思路 测试网站地址:http://baijiahao.baidu.c ...

  6. Linux操作系统安全-OpenSSL工具常用命令介绍

    Linux操作系统安全-OpenSSL工具常用命令介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.OpenSSL开源项目有三个组件 openssl: 多用途的命令行工具,包 ...

  7. vmware中桥接模式,NAT模式,主机模式的区别

    桥接模式 在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和虚拟机处于对等地 位),它可以访问网内任何一台机器.在桥接模式下,我们往往需要为虚拟主机配置IP地址.子网掩 ...

  8. Discuz!开发之时间处理函数dgmdate()详解

    使用过Discuz!的朋友都会知道Discuz!的时间可以显示成多少秒前.多少分钟前.几个小时前.几天前等等,而不是单纯的显示标准时间,这样的时间显示方式就更显得人性化了!   那么Discuz!是如 ...

  9. PassArrayByCopy_test.php

    <?php //PassArrayByCopy_test.php $a=array("a","b","c"); function te ...

  10. Pandas | 24 常用图形绘制

    基本绘图:绘图 Series和DataFrame上的这个功能只是使用matplotlib库的plot()方法的简单包装实现. import pandas as pd import numpy as n ...