【题解】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. <Android Studio> 4.Adapter的那些事 <一>

    android 的表格显示和Windows桌面开发原理不同,其他平台转过来的同学要有心理准备,不要拿桌面开发的思维模式来思考android上的各种表格. 一.原理 此处使用ArrayAdapter来记 ...

  2. scrapy参数

    当Scrapy正常运行时,下载器是瓶颈. 在这种情况下,你会看到调度器中有一些请求,下载器中的并发请求数目已经达到最大值,而scraper(爬虫和pipeline)的负载较轻,正在处理的Respons ...

  3. Nginx七层负载均衡的几种调度算法

      Nginx是一款轻量级的高性能web服务器,同时也是一款非常优秀的负载均衡器和反向代理服务器.由于支持强大的正则匹配规则.动静分离.URLrewrite功能及安装配置简单且对网络稳定性依赖非常小等 ...

  4. 201671010447 杨露露 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 总结这学期软件工程学习获得 一 ...

  5. vector、ArryList、LinkedList的区别与联系

    vector.ArryList.LinkedList的区别与联系 vectory类:底层 采用数组结构算法,使用了线程锁(synchronized),线程安全,但是性能相对ArryList比较低. A ...

  6. getElementsByName兼容ie 但并不是兼容ie下的所有标签

    document.getElementsByName('someName') 返回一个节点列表(数组) document.getElementById('id') 返回一个节点或者null 注意在IE ...

  7. Module build failed: Error: Cannot find module 'node-sass'

    安装npm 遇到 Module build failed: Error: Cannot find module 'node-sass' 这次通过重装 npm 完成 先卸载npm npm uninsta ...

  8. hdu5285-wyh2000 and pupil-(染色法二分图判定)

    http://acm.hdu.edu.cn/showproblem.php?pid=5285 题意:把互不认识的人分到两个组,第一组人数尽可能多. 题解:把互不认识的人连起来,当作二分图,二分图可能有 ...

  9. Browser cannot find PAC because wpad hostname cannot be resolved

    Enterprise Network administrator may faultly forget to configure wpad hostname to DNS server. If use ...

  10. LeetCode 825. Friends Of Appropriate Ages

    原题链接在这里:https://leetcode.com/problems/friends-of-appropriate-ages/ 题目: Some people will make friend ...