Codeforces Round #524 (Div. 2) E. Sonya and Matrix Beauty(字符串哈希,马拉车)
https://codeforces.com/contest/1080/problem/E
题意
有一个n*m(<=250)的字符矩阵,对于每个子矩阵的每一行可以任意交换字符的顺序,使得每一行每一列都是一个回文串,问最多有多少个这样的子矩阵
思路
- 首先可以思考如何暴力,枚举四个边界(子矩阵),然后判定一下子矩阵的每一行每一列,这样的复杂度是nmnmn*m
- 很明显需要找一下规律来优化一下复杂度,
- 对于每一行来说,最多只能存在一种字母的数量是奇数,这样一定可以保证这一行是回文串
- 对于每一列来说,因为不能交换顺序,所以必须具有回文性质(关于中心点对称),这就需要要求每一行相同的字母数量应该相同
- 根据第二个规律,因为只需要验证每一行是否相同,所以可以采用字符串hash每一行,O(n*m)处理,O(1)验证
- 首先枚举列的两个端点 O(mm),然后o(n)找出所有连续的回文行,跑马拉车算法,求出连续的回文行中所有的回文子行,O(n),总复杂度O(mm*n)
- 符合回文性质的都可以用马拉车求出最长回文字串,回文字串个数
#include<bits/stdc++.h>
#define ll long long
#define M 605
#define key 233
#define P 1000000007
using namespace std;
int n,m,i,j,a[M][M],c1,c2,l1,l2,msk[M],cnt[M][30],x,ans=0,d1[M],d2[M];
char s[M];
ll hs[M],p[M],tp[M];
int ck(int x){
return (x==0)||((x&(x-1))==0);
}
void init(){
p[0]=1;for(int i=1;i<=30;i++)p[i]=p[i-1]*key%P;
}
int cal(int l1,int l2){
int n=0,ans=0;
for(int i=l1;i<=l2;i++)tp[++n]=hs[i];
int l=0,r=0,x;
for(int i=1;i<=n;i++){
if(i>r)x=1;
else x=min(d1[l+r-i],r-i);
while(i-x>=1&&i+x<=n&&tp[i-x]==tp[i+x])x++;
d1[i]=x;
ans+=d1[i];
if(i+x-1>r){r=i+x-1;l=i-x+1;}
}
l=r=0;
for(int i=1;i<=n;i++){
if(i>r)x=0;
else x=min(d2[l+r-i+1],r-i+1);
while(i-x-1>=1&&i+x<=n&&tp[i-x-1]==tp[i+x])x++;
d2[i]=x;
ans+=d2[i];
if(i+x>=r){l=i-x;r=i+x-1;}
}
return ans;
}
int main(){
init();
cin>>n>>m;
for(i=1;i<=n;i++){
scanf("%s",s+1);
for(j=1;j<=m;j++){
a[i][j]=s[j]-'a';
}
}
for(c1=1;c1<=m;c1++){
for(i=1;i<=n;i++){
hs[i]=0;msk[i]=0;
memset(cnt[i],0,sizeof(cnt[i]));
}
for(c2=c1;c2<=m;c2++){
for(i=1;i<=n;i++){
x=a[i][c2];
if(cnt[i][x]){
hs[i]-=cnt[i][x]*p[x+1]%P;
if(hs[i]<0)hs[i]+=P;
}
cnt[i][x]++;
hs[i]+=cnt[i][x]*p[x+1]%P;hs[i]%=P;
msk[i]^=(1<<x);
}
l1=1;
while(l1<=n){
if(!ck(msk[l1])){l1++;continue;}
l2=l1;
while(l2<=n&&ck(msk[l2]))l2++;
l2--;
ans+=cal(l1,l2);
l1=l2+1;
}
}
}
cout<<ans;
}
Codeforces Round #524 (Div. 2) E. Sonya and Matrix Beauty(字符串哈希,马拉车)的更多相关文章
- Codeforces Round #495 (Div. 2) D. Sonya and Matrix
http://codeforces.com/contest/1004/problem/D 题意: 在n×m的方格中,选定一个点(x,y)作为中心点,该点的值为0,其余点的值为点到中心点的曼哈顿距离. ...
- Codeforces Round #524 (Div. 2)(前三题题解)
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
- Codeforces Round #524 (Div. 2) Solution
A. Petya and Origami Water. #include <bits/stdc++.h> using namespace std; #define ll long long ...
- Codeforces Round #371 (Div. 1) C. Sonya and Problem Wihtout a Legend 贪心
C. Sonya and Problem Wihtout a Legend 题目连接: http://codeforces.com/contest/713/problem/C Description ...
- Codeforces Round #371 (Div. 2) C. Sonya and Queries 水题
C. Sonya and Queries 题目连接: http://codeforces.com/contest/714/problem/C Description Today Sonya learn ...
- Codeforces Round #371 (Div. 2) C. Sonya and Queries —— 二进制压缩
题目链接:http://codeforces.com/contest/714/problem/C C. Sonya and Queries time limit per test 1 second m ...
- Codeforces Round #371 (Div. 2)E. Sonya and Problem Wihtout a Legend[DP 离散化 LIS相关]
E. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...
- Codeforces Round #371 (Div. 2) C. Sonya and Queries[Map|二进制]
C. Sonya and Queries time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces Round #495 (Div. 2) C. Sonya and Robots
http://codeforces.com/contest/1004/problem/C 题意: 在一行上有n个数字,现在在最左边和最右边各放置一个机器人,左右机器人各有一个数字p和q.现在这两个机器 ...
随机推荐
- f5 2017.09.03故障
1.下午14点50左右有同事反应epm等系统登录有问题.自测登录也是有同样的报错. 2.测试发现内部IP直接访问正常,但是访问f5的vip的方式访问不了.此时oa.邮件等系统也开始有同事发现故障. 3 ...
- XSS 攻击的防御
xss攻击预防,网上有很多介绍,发现很多都是只能预防GET方式请求的xss攻击,并不能预防POST方式的xss攻击.主要是由于POST方式的参数只能用流的方式读取,且只能读取一次,经过多次尝试,自己总 ...
- JFinal Model判断数据库某条记录的属性字段是否包含空值
如果做报表,一条记录中有空值,使用FreeMarker渲染word会报错,并把错误日志输出到Word中.所以需要之前判断下当前记录中属性值是否有空值. package com.huijiasoft.u ...
- JFinal Web开发学习(三)前后台路由设计
效果图: 一.写控制器 1.在controller包中新建AdminController后台控制器,继承Controller,实现一个index方法,作为的处理方法. /admin 后面,这个控制器中 ...
- input框和文字对齐问题
css样式解决! style="vertical-align: text-bottom;margin-bottom: 2px;"一.问题产生的条件对于14像素大小的字体是没有本篇所 ...
- Java并发集合(三)-ConcurrentHashMap分析和使用
1 http://ifeve.com/hashmap-concurrenthashmap-%E7%9B%B8%E4%BF%A1%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87% ...
- (转)关于X64位系统IIS7下支持32位asp.net程序
最近在windows2008 x64位系统下的IIS7下部署asp.net程序. vs2005或vs2008默认的情况下是Any cpu 的也就是支持x86和x64两种系统的.可我的程序在引用了一个三 ...
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 : ...
- Docker原生网络技术简介
Docker原生网络技术简介 默认网络 在宿主机部署好Docker Engine后会默认创建三种网络:Bridge.Host和None,如下: docker network ls NETWORK ID ...
- js 闭包 理解 copy
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...