多校一道KMP+DP的题

难啊,多校当时根本不会做
 

题目描述

White Cloud has a rectangle carpet of n*m. Grid (i,j) has a color colorA[i][j] and a cost costA[i][j].
White Rabbit will choose a subrectangle B of p*q from A and the color of each grid is colorB[0...p-1][0...q-1], the cost of B is the (maximum number in the corresponding subrectangle of costA*(p+1)*(q+1).
Then colorB is continuously translated and copied in an infinite times, that is, expand colorB into an infinite new matrix, colorC, which satisfies colorC[i][j]=colorB[i mod p][j mod q].
White Rabbit must ensure that colorA is a subrectangle of colorC.
You need to find the minimum cost way.
 

输入描述:

The first line of input contains two integers n,m(0<n*m <= 1000000)
For the next line of n lines, each line contains m lowercase English characters, denoting colorA.
For the next line of n lines, each line contains m integers in range [0,1000000000], denoting costA.

输出描述:

Print the minimum cost.

示例1

输入

2 5
acaca
acaca
3 9 2 8 7
4 5 7 3 1

输出

18

说明

choose subrectangle colorA[1...1][3...4]=ca, After copying unlimited copiescolorC=cacacacaca ...cacacacaca ...cacacacaca ...cacacacaca ...cacacacaca ............colorA is a subrectangle of colorCthe cost is max(3,1)*(1+1)*(2+1).

 

题目大意:有一个n*m的矩阵A,每个位置有一个字符和一个权值,现在要找一个子矩阵,使得这个子矩阵是A的一个 循环节,并最小化子矩阵的权值最大值。

做法
首先要找到矩阵的一个最小的循环节,假设是p和q,那么最优解就一定是选一个p*q的子矩形。
如何求最小的循环节?行和列可以独立考虑。 求列的循环节时,我们可以对每一行做一次kmp,找到这些行的最大公共循环节。 求行的循环节时,我们可以对每一列做一次kmp,找到这些列的最大公共循环节。
接下来问题就变成了,求所有大小为p*q的子矩形的最大值的最小值。可以采用单调队列,求出 所有p*q的子矩形的最大值,然后找一个最小的即可。

 

标程:(肯定不是我写的哈哈)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<assert.h>
using namespace std;
int gi() {int w;char c;while (((c=getchar())<'0'||'9'<c)&&c!='-');w=c-'0';while ('0'<=(c=getchar())&&c<='9') w=(w<<3)+(w<<1)+c-'0';return w;
}
const int seed=131;
const int mod=1e9+7;
const int N=1e6+100;
int h[N],L[N],nxt[N];
inline int kmp(int *a,int n) {nxt[0]=0;int i,c,p;for (i=1;i<n&&a[i]==a[i+1];i++);i--;nxt[2]=i;c=2,p=2+nxt[2]-1;if (nxt[2]==n-1) return 1;for (i=3;i<=n;i++) {if (p<i||p-i+1<=nxt[i-c+1]) {nxt[i]=max(p-i+1,0);while (a[nxt[i]+i]==a[nxt[i]+1]) nxt[i]++;if (i+nxt[i]>n) return i-1;c=i,p=i+nxt[i]-1;}else nxt[i]=nxt[i-c+1];}return n;
}
int Val[N],Q[N];
#define val(x,y) Val[((x)-1)*m+(y)]
#define q(x,y) Q[((x)-1)*m+(y)]
int l[N],r[N],n,m;
int qq[N],w[N];
int key[26];
char s[N];
int main() {int i,j,a,b,ll,rr;char c;int ans=2147483647;n=gi(),m=gi();assert(0<n*m&&n*m<=1e6);for (i=0;i<26;i++) key[i]=rand();for (i=1;i<=n;i++) {scanf("%s",s+1);assert(strlen(s+1)==m);for (j=1;j<=m;j++) {c=s[j];assert('a'<=c&&c<='z');h[i]=(1LL*h[i]*seed+key[c-'a'])%mod;L[j]=(1LL*L[j]*seed+key[c-'a'])%mod;}}a=kmp(h,n);b=kmp(L,m);for (i=1;i<=n;i++) for (j=1;j<=m;j++) val(i,j)=gi(),assert(0<=val(i,j)&&val(i,j)<=1e9);for (i=1;i<=n;i++) l[i]=1,r[i]=0;for (j=1;j<b;j++)for (i=1;i<=n;i++) {while (l[i]<=r[i]&&val(i,j)>=val(i,q(i,r[i]))) r[i]--;q(i,++r[i])=j;}for (j=b;j<=m;j++) {ll=1,rr=0;for (i=1;i<a;i++) {if (l[i]<=r[i]&&q(i,l[i])<=j-b) l[i]++;while (l[i]<=r[i]&&val(i,j)>=val(i,q(i,r[i]))) r[i]--;q(i,++r[i])=j;while (ll<=rr&&val(i,q(i,l[i]))>=qq[rr]) rr--;qq[++rr]=val(i,q(i,l[i])),w[rr]=i;}for (i=a;i<=n;i++) {if (l[i]<=r[i]&&q(i,l[i])<=j-b) l[i]++;while (l[i]<=r[i]&&val(i,j)>=val(i,q(i,r[i]))) r[i]--;q(i,++r[i])=j;if (ll<=rr&&w[ll]<=i-a) ll++;while (ll<=rr&&val(i,q(i,l[i]))>=qq[rr]) rr--;qq[++rr]=val(i,q(i,l[i])),w[rr]=i;ans=min(ans,qq[ll]);}}cout<<1LL*(a+1)*(b+1)*ans<<endl;return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python(2)-第一个python程序、执行python程序三种方式

第一个Python 程序1. 第一个Python 程序2. 常用两Python个版本3. 程序执行的三种方式3.1 解释器3.2 交互式运行Python程序3.3 IDE&#xff08;集成开发环境&#xff09;-pycharm1. 第一个Python 程序 Python 源程序就是一个特殊格式的文本文件&#xff0c;所以可以采用任意的文…

推荐算法---FM,协同过滤

文章目录目录1.FM算法产生背景2.FM算法模型3.FM算法VS其他算法4.推荐算法总结目录 1.FM算法产生背景 在传统的线性模型如LR中&#xff0c;每个特征都是独立的&#xff0c;如果需要考虑特征与特征直接的交互作用&#xff0c;可能需要人工对特征进行交叉组合&#xff1b;非线性…

借助桶排序思想完成的一道题

问题&#xff1a; 数组排序之后的相邻数的最大差值&#xff1b; 嗯&#xff0c;你可以排序&#xff0c;然后找相邻的最大差值。 但是你觉得这么简单我写他干啥。 最优解&#xff1a;时间复杂度O(N)&#xff0c;空间O(1) 那我们开始说这种方法&#xff1a; 1&#xff09;遍…

Python(3)-Pycharm基本使用技巧

初识Pycharm1.界面2.恢复初始设置3.第一次打开Pycharm4.打开一个项目5.设置解释器的版本。6.新建项目7.编辑器、控制台的字体设置Pycharm–适合于开发管理大型项目&#xff0c;项目是用以解决复杂功能的软件。1.界面 导航区–主要有什么文件 编辑区–编辑具体的文件 控制台窗口…

推荐算法概述(01)

1.什么是推荐系统 用户没有明确的需求&#xff0c;你需要的是一个自动化的工具&#xff0c;它可以分析你的历史兴趣&#xff0c;从庞大的电影库中找到几部符合你兴趣的电影供你选择。这个工具就是个性化推荐系统。 推荐系统的主要任务 推荐系统的任务就是联系用户和信息&…

CSDN-Markdown编辑器使用小技巧

Markdown编辑器使用小技巧1.图片无法显示1.图片无法显示 1.检查图片的命名格式是否正确&#xff0c;数字不能作为图片名称开头&#xff0c;虽然window操作系统下能够识别&#xff0c;但是导入图片的时候会造成无法显示的错误。

何为布隆过滤器

问题的提出 我们有一个不安全网页的黑名单&#xff0c;包含了100亿个黑名单网页的URL,每个网页URL最多占用64B.。 现在我们要设计一个网页过滤系统&#xff0c;这个系统要判断该网页是否在黑名单里&#xff0c;但是我们的空间有限&#xff0c;只有30GB. 允许有万分之一的判断…

推荐算法--利用用户行为数据(02)

文章目录目录1.什么是用户行为数据&#xff1f;1.1用户行为分类2.用户行为数据如何使用&#xff1f;2.1 用户活跃度和物品流行度的分布2.2 用户活跃度和物品流行度的关系2.3 协同过滤算法3.实验设计和算法评测4.基于邻域的的推荐算法4.1 基于用户的协同过滤算法4.2 基于物品的协…

《Head First设计模式》第九章(2)组合模式

组合模式 ​ 基于前一篇迭代模式的案例进行需求更新&#xff0c;餐厅的菜单管理系统需要有煎饼屋菜单和披萨菜单。现在希望在披萨菜单中能够加上一份餐后甜点的子菜单。 在迭代模式中&#xff0c;披萨菜单是用数组维护的&#xff0c;我们需要让披萨菜单持有一份子菜单&#xf…

Python(4)--Pycharm安装、使用小技巧

Pycharm安装1.专业版Pycharm 安装2.设置Pycharm桌面快捷图标3.Linux卸载一个软件4.教育版Pycharm的安装5.多文件项目演练&#xff08;Pycharm针对学生和教师开发了免费使用版&#xff09;1.专业版Pycharm 安装 1.官网下载安装包 .tar.gz 2.解压缩 tar -zxvf 文件名 3.移动解压…

推荐算法--推荐系统冷启动问题(03)

文章目录目录1.什么是冷启动问题&#xff1f;1.1冷启动问题1.2 冷启动问题的分类1. 用户冷启动2 物品冷启动3 系统冷启动2.如何解决冷启动问题&#xff1f;2.1利用用户注册信息2.2选择合适的物品启动用户的兴趣2.3利用物品的内容信息2.4 发挥专家的作用目录 1.什么是冷启动问题…

《Head First 设计模式》第十章-状态模式 状态模式

状态模式 策略模式和状态模式是双胞胎&#xff0c;在出生时才分开。你已经知道&#xff0c;策略模式是围绕可以互换的算法来创建成功业务的&#xff0c;然而&#xff0c;状态走的是更崇高的路&#xff0c;它通过改变对象内部的状态来帮助对象控制自己的行为。 定义状态模式 …

推荐算法--利用用户标签数据(04)

文章目录流行的推荐系统通过3种方式联系用户兴趣和物品 &#xff08;1&#xff09;&#xff1a;利用用户喜欢过的物品&#xff0c;给用户推荐与他喜欢过的物品相似的物品&#xff0c;这是基于物品的算法。 &#xff08;2&#xff09;&#xff1a;利用和用户兴趣相似的其他用户…

Python(5)-注释

Python注释1.单行注释2. 多行注释&#xff08;块注释&#xff09;3.注释的使用和代码规范pyhton 的注释 使用自己熟悉的语言&#xff08;中文&#xff09;&#xff0c;解释代码。Python解释器在执行文件时不会执行井号右边边的内容。1.单行注释 # 井号后面跟着注释内容 灰灰的虚…

玩具kv数据库

介绍 用java写一个简陋的kv数据库&#xff08;俩小时的货&#xff09;&#xff0c;用来复习一下java流知识、线程、socket等知识。 客户端&#xff1a;很简单的写了一下功能&#xff1a;就是发送用户的命令&#xff0c;还有接收数据显示出来 服务端&#xff1a;redis类&#…

网络原理知识点总结

第一章&#xff1a; 计算机网络系统由资源子网和通信子网组成。 计算机网络系统主要由网络通信系统、操作系统和应用系统构成 互联网基础结构发展的三个阶段&#xff1a; 第一阶段&#xff1a;从单个网络 ARPANET 向互联网发展的过程。 第二阶段&#xff1a;建成了三级结构…

推荐算法--时效性(05)

时效性 推荐系统应该考虑时间效应&#xff0c;因为用户的兴趣是有时间变化的。用户一年前喜欢的东西现在不一定感兴趣&#xff0c;相比于推荐过去喜欢的物品&#xff0c;推荐用户近期喜欢的物品更有参考价值。而在新闻更是如此&#xff0c;推荐过去跟用户兴趣一致的新闻已经失去…

初识博弈论(1)

博弈论与主流经济学的新发展1.经济学的研究内容2.博弈论的研究内容3.博弈论的发展简史4.经济学发展的趋势本系列博文主要记录了学习张维迎老师的《博弈论与信息经济学》一书相关内容&#xff0c;如果有误之处恳请指出&#xff1b;或对照张老师的书籍进行学习。1.经济学的研究内…

c语言实现排序和查找所有算法

c语言版排序查找完成&#xff0c;带详细解释&#xff0c;一下看到爽&#xff0c;能直接运行看效果。 /* Note:Your choice is C IDE */ #include "stdio.h" #include"stdlib.h" #define MAX 10 void SequenceSearch(int *fp,int Length); void Search(int …

推荐算法--推荐系统架构(06)

外围架构一般来说&#xff0c;每个网站都有一个 UI 系统&#xff0c;UI 系统负责给用户展示网页并和用户交互。网站会通过日志系统将用户在 UI 上的各种各样的行为记录到用户行为日志中。 从上面的结构可以看到&#xff0c;除了推荐系统本身&#xff0c;主要还依赖两个条件--界…