链接

点击跳转

题解

首先注意到,如果一个子矩阵可以作为循环节,那么如果另一个能作为循环节的矩阵包含了这个矩阵,那么大一点的矩阵的答案一定不会比小矩阵更优。

所以,我只需要找最小循环节。

先把每行求出一个哈希值,然后用这个哈希值做kmp,这样就得到了行方向上的最小循环节长度,假设是p

然后把前p行拿出来,每一列求一个哈希值,再kmp。这样得到一个列方向上的最小循环节

然后现在就相当于拿一个大小为p*q的框,去框一个子矩阵,使得最大值最小

这个东西在两个方向上维护单调队列就可以做

代码

#include <bits/stdc++.h>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 2000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,b) for(i=a;i<=b;i++)
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{ll c, f(1);for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;for(;isdigit(c);c=getchar())x=x*10+c-0x30;return f*x;
}
ll n, m;
int Hash[maxn];
struct Array2
{ll n, m, a[maxn];void init(ll N, ll M){n=N, m=M;for(ll i=0;i<n*m;i++)a[i]=0;}ll index(ll i, ll j){return i*m+j;}ll& at(ll i, ll j){return a[index(i,j)];}ll* operator[](ll i){return a+i*m;}
}w, s, dq;
ll L[maxn], R[maxn];
struct KMP
{int n, next[maxn], t[maxn];void build(int *r, int len){int i, j=0;n=len;for(i=1;i<=len;i++)t[i]=r[i];  t[len+1]=0;for(i=2;i<=len;i++){for(;j and t[j+1]!=t[i];j=next[j]);next[i] = t[j+1]==t[i]?++j:0;}}int move(int pos, int x){for(;pos and t[pos+1]!=x;pos=next[pos]);return t[pos+1]==x ? pos+1 : 0;}
}kmp;
char str[maxn], tmp[maxn];
ll gethash(char *s, ll len)
{ll i, ret=0, base=4894111, mod=998244353;rep(i,1,len)ret = (ret * base + s[i]) %mod;return ret;
}
int main()
{de( ( sizeof(w)+sizeof(s)+sizeof(dq) >>20 ) );ll i, j;n=read(), m=read();w.init(n+1,m+1), s.init(n+1,m+1), dq.init(n+1,m+1);rep(i,1,n){scanf("%s",str+1);rep(j,1,m)s[i][j]=str[j];Hash[i]=gethash(str,m);}rep(i,1,n)rep(j,1,m)w[i][j]=read();kmp.build(Hash,n);ll p = n - kmp.next[n];rep(j,1,m){rep(i,1,p)tmp[i]=s[i][j];Hash[j] = gethash(tmp,p);}kmp.build(Hash,m);ll q = m - kmp.next[m], ans=linf;rep(j,1,m){rep(i,1,n){auto que = dq[i];auto &l=L[i], &r=R[i];if(l<r and que[l]<j-q+1)l++;while(l<r and w[i][que[r-1]] < w[i][j])r--;que[r++] = j;}deque<int> que;rep(i,1,n){if(que.size() and que.front()<i-p+1)que.pop_front();while(que.size() and w[que.back()][ dq[que.back()][L[que.back()]] ] < w[i][ dq[i][L[i]] ])que.pop_back();que.push_back(i);if(i>=p and j>=q){ans = min(ans,w[que.front()][ dq[que.front()][L[que.front()]] ]);}}}printf("%lld",ans*(p+1)*(q+1));return 0;
}

nowcoder16638 carpet相关推荐

  1. Aladdin and the Flying Carpet (素数打表+正整数的唯一分解定理,找因数对)

    题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况 题目分析:根据唯一分解定理先将a唯一分解,则a的所有正约数的个数为 ...

  2. Java之于Javascript就好比Car(汽车)之于Carpet(地毯)。

    Java之于Javascript就好比Car(汽车)之于Carpet(地毯). --来自Usenet上的Javascript讨论组 中国本地版的说法应该是这样的:Java之于JavaScript就好比 ...

  3. Lesson 52 A pretty carpet 漂亮的地毯

    1.原文 2. 参考译文 3. New words and expressions ★inch n. 英寸(度量单位)foot 英尺(pl. feet ); mile 英里 ★space n. 空间 ...

  4. Aladdin and the Flying Carpet(唯一分解定理)

    传送门 It's said that Aladdin had to solve seven mysteries before getting the Magical Lamp which summon ...

  5. 【light 1341Aladdin and the Flying Carpet】

    给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. 肯定是和面积的因子有关系了,边长都是面积值的 因子. 那么就可以算出面积值得所有因子,因为是让求得矩形得个数,当然是要& ...

  6. Petrozavodsk Winter Camp, Warsaw U, 2014, A The Carpet

    一个地图上有若干障碍,问允许出现一个障碍的最大子矩形为多大? 最大子矩形改编 #include<bits/stdc++.h> using namespace std; #define re ...

  7. hihoCoder 1257 Snake Carpet(很简单的构造方法)

    2015 ACM / ICPC 北京现场赛 I 题 构造 注意一个小坑,每条蛇的输出是要从头到尾输出的. 还要注意的是,不能开数组去模拟构造过程,然后输出,那样会TLE的. #include < ...

  8. hiho1257 Snake Carpet

    题目链接:http://hihocoder.com/problemset/problem/1257 题目大意:有n条蛇 编号为1-n 每条蛇的长度跟编号相等 奇数编号的蛇必须拐奇数次(除了第一条)偶数 ...

  9. 牛客暑假多校第二场 K carpet

    题意:给你一个n*m的矩阵 ,每个位置都有一个字符并且都有一个值,现在需要找到一个p*q的子矩阵, 原来的矩阵可以由现在这个矩阵无限复制然后截取其中的一部分得到,并且要求 子矩阵里最大的值 * (p+ ...

  10. # python # # 分形 # Sierpinski Carpet 谢尔宾斯基地毯 续

    运行过程绘图和动图: 原创声明需要超过300字,贴一点生成动图的代码片段. # encoding=utf8from PIL import Imagefiles = ['#000000.png', '# ...

最新文章

  1. .NET中获取电脑名,IP地址,当前用户
  2. SQL2005CLR函数扩展-正则表达式
  3. Linux shell 正则表达式用法
  4. git经常使用命令和问题
  5. Tensorflow:模型训练tensorflow.train
  6. [CF809E] Surprise me!
  7. 如何把握好 transition 和 animation 的时序,创作描边按钮特效...
  8. Angular学习笔记06——钩子
  9. 已知元器件名,AD原理库快速查找元器件
  10. php数字月份转英文,php如何实现月份转英文
  11. 数据库无法连接的几种情况
  12. Web server failed to start. Port 9080 was already in use报错解决
  13. Flutter问题集
  14. 1026-西方经济学(本)8153-商务交际英语(2)
  15. 银联在线支付对接流程以及签名算法
  16. 名校博士生临近毕业突然离世,去世前一直在熬夜完善毕业论文
  17. 江苏省扬州市谷歌高清卫星地图下载
  18. Go语言版黑白棋(十一):机器落子
  19. 面试官:说说react的渲染过程
  20. PC客户端离线安装包和下载器安装包的优劣点

热门文章

  1. 职场篇(一):明哥的职场礼仪七堂课笔记
  2. 基于EV/EBITDA的量化策略(基于python,附代码)
  3. pandas警告SettingWithCopyWarning: A value is trying to ...原理和解决方案
  4. PS教程:清凉一下美女海报设计教程及素材
  5. 大连发展中韩跨境电子商务势在必行
  6. linux mbr转换成gpt分区格式,GPT分区格式与MBR格式互相转换的方法
  7. java实现给图片添加水印
  8. 用javascript访问操作iframe中的dom对象
  9. mysql实现拼音首字母查询
  10. 【学术 | 比赛】比赛?论文?先收藏!29个学术网站,比赛论文不再困难