NC13610 矩阵

题目描述

给出一个n * m的矩阵。让你从中发现一个最大的正方形。使得这样子的正方形在矩阵中出现了至少两次。输出最大正方形的边长。

输入描述:

第一行两个整数n, m代表矩阵的长和宽;
接下来n行,每行m个字符(小写字母),表示矩阵;

输出描述:

输出一个整数表示满足条件的最大正方形的边长。

输入

5 10
ljkfghdfas
isdfjksiye
pgljkijlgp
eyisdafdsi
lnpglkfkjl

输出

3

备注:

对于30%的数据,n,m≤100;
对于100%的数据,n,m≤500;

题目分析

由数据规模可推出时间复杂度应不高于O(n^2log(n)))

如果暴力遍历,则时间复杂度为O(n^3)及以上。

考虑使用二维字符串哈希,便于快速比较两个不同的字符正方形是否相同;

同时,考虑遍历正方形边长时,使用二分查找方法。

题目代码

关于,二分查找也可以看下这篇文章,里面有些资源可以帮助理解。

#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;  //使用ull可自动取模2^64

const int N = 5e2 + 10;
const int base1 = 131, base2 = 233;  //用于哈希
ull p1[N], p2[N];
map<ull, int> mp;  //统计哈希值为X的正方形个数
char s[N][N];  //原字符数组
ull h[N][N];   //哈希数组
int n, m;
//由于要求前缀和,所以下标均从1开始

bool val(int x){  //求解
    mp.clear(); //记得清除映射
    
    for(int i = x; i <= n; ++i){
        for(int j = x; j <= m; ++j){
            ull k = h[i][j] - h[i-x][j]*p2[x] - h[i][j-x]*p1[x] + h[i-x][j-x]*p2[x]*p1[x];
            ++mp[k];            
            if(mp[k] > 1) return true;
        }
    }
    
    return false;  //不满足条件
}


int main(){
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) scanf("%s", (s[i]+1));

    //1. 预处理哈希的幂次方, 用于后续字符串对齐
    p1[0] = p2[0] = 1;  //!
    for(int i = 1; i < N; ++i){
        p1[i] = p1[i-1] * base1;
        p2[i] = p2[i-1] * base2;
    }
    
    //2. 计算二维字符串前缀和
    //2.1 计算一维 行 前缀和
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            h[i][j] = h[i][j - 1] * base1 + (s[i][j]-'a');
    //2.2 计算以(i,j)为右下角的二维 矩阵 前缀和
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            h[i][j] = h[i-1][j] * base2 + h[i][j];
    
    //3. 二分法求解满足条件的正方形最大的边长
//     //此处二分法使用开区间方法 (l, r)为待查找区间
//     int l = 0, r = min(n,m)+1;
//     while(l < r-1){
//         int mid = l + (r-l)/2;
//         if(val(mid)) l = mid;
//         else r = mid;
//     } // 出来时, l == r-1
//     //[0, l]满足条件, ..., [r, min(n,m)]不满足条件
//     //l即为所求
//     cout << l << endl;
    
//     //此处二分法使用闭区间方法 [l,r]为待查找区间
//     int l = 1, r = min(n, m);
//     while(l <= r){
//         int mid = l + (r-l)/2;
//         if(val(mid)) l = mid+1;
//         else r = mid-1;
//     } //出来时,r == l-1
//     //[0, l)满足条件,...,(r, min(n,m)]不满足条件
//     //l-1即为所求
//     cout << l-1 << endl;
    
    //此处二分法使用左开右闭区间方法 [l, r)为待查找区间
    int l = 1, r = min(n,m)+1;
    while(l < r){
        int mid = l + (r-l)/2;
        if(val(mid)) l = mid+1;
        else r = mid;
    } //出来时,l == r
    //[0, l)均满足条件,...,[r, min(n,m)]均不满足条件
    //l-1即为所求
    cout << l-1 << endl;
    
    return 0;
}

三种二分查找均已通过!🎉

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java8 新特性 Stream流操作

数据准备 package test;/*** [一句话描述该类的功能]** author : [61692]* version : [v1.0]* createTime : [2024/3/31 14:52]*/ public class Student {private int id;private int age;private int yuwenScore;private int mathScore;private String name;private int yi…

c++初阶篇----string的底层模拟

string类的模拟 目录 string类的模拟功能介绍各功能的实现类的构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数迭代器的实现string的内部容量访问成员函数string的修改成员函数string类的相关联函数string类的输入输出友元 汇总string功能的实现汇总测试代码 功能介绍 …

Vue3+.NET6前后端分离式管理后台实战(八)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(八)已经在订阅号发布有兴趣的可以关注一下&#xff01; 有兴趣的可以关注一下&#xff1a;

深入剖析Spring WebFlux:从MethodHandler到反射获取请求信息的源码之旅

文章目录 前言一、获取请求执行的类、方法信息二、获取请求url变量三、获取请求处理数据总结 前言 最近想写一个代办事项后台服务&#xff0c;底层&#xff0c;选型WebFlux。在操作层面上&#xff0c;针对部分操作&#xff0c;想在不侵入业务代码的前提下&#xff0c;记录操作…

泛型总结(擦除机制+泛型上界+通配符的上下界)

文章目录 泛型一、 什么是泛型1.能用于多种类型&#xff0c;把类型当做参数1.1 作用1.2 语法 二、擦除机制1. 为什么采用擦除机制实现泛型&#xff1f;向后兼容性 移植兼容性 2. 为什么不能使用“newT()”&#xff1f;3. 创建类型T的数组3.1 不安全的写法3.2 官方的写法 3. 3 正…

从0到1:兼职招聘小程序开发笔记(一)

可行性分析 兼职招聘小程序&#xff1a;为雇主和求职者提供便利的平台&#xff0c;旨在帮助雇主招聘兼职员工&#xff0c;并让求职者寻找合适的兼职工作。提供简单、快捷的方式来匹配兼职岗位和候选人&#xff0c;节省了招聘和求职的时间和精力。其主要功能模块包括&#xff1…

Cross Hyperspectral and LiDAR Attention Transformer

TGRS 2024&#xff1a;Cross Hyperspectral and LiDAR Attention Transformer: An Extended Self-Attention for Land Use and Land Cover Classification 题目 Cross Hyperspectral and LiDAR Attention Transformer: An Extended Self-Attention for Land Use and Land Cov…

安装mysql8,启动mysql服务日志 libstdc++.so.6: wrong ELF class: ELFCLASS32

背景&#xff1a;linux centos7.9安装mysql5.7版本&#xff0c;服务启动成功后被告知要求安装mysql8版本&#xff0c;故卸载之后安装mysql8&#xff0c;后启动mysql服务报错提示&#xff1a;libstdc.so.6: wrong ELF class: ELFCLASS32 解决办法&#xff1a; 1、下载安装包li…

LeetCode Python - 81. 搜索旋转排序数组 II

目录 题目描述解法运行结果 题目描述 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 […

屌爆了,我不懂音乐,但AI让我一天完成原创专辑制作

前言 作为一个完全不懂音乐的程序员&#xff0c;我从未想象过自己能够踏入音乐创作的领域。然而&#xff0c;借助AI的力量&#xff0c;我竟然实现了制作一张完整专辑的梦想&#xff0c;而整个过程不过一天时间。从写词到生成音频&#xff0c;再到制作MV&#xff0c;每首歌曲仅需…

PHP在线客服系统源码修复版

源码简介 在线客服系统网站源码https://www.888host.cn/330.html 新增消息预知&#xff0c;消息撤回&#xff0c;消息已读未读&#xff0c; 修复需要刷新才能收到消息 修复客户来源地址 修复消息提示音 修复桌面推送提醒 搭建环境 宝塔面板 &#xff0c;Nginx1.16-1.18 …

什么是检索增强生成(Retrieval-Augmented Generation,RAG)

什么是RAG&#xff1f; 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;&#xff0c;是指为大模型提供外部知识源的概念。能够让大模型生成准确且符合上下文的答案&#xff0c;同时能够减少模型幻觉。 用最通俗的语言描述&#xff1a;在已…

第十四届蓝桥杯软件赛省赛C/C++ C组 思路讲解与参考代码

A. 求和&#xff1a; 问题描述 求 11 &#xff08;含&#xff09;至 2023040820230408 &#xff08;含&#xff09;中每个数的和。 思路&#xff1a;等差数列&#xff0c;d位1&#xff0c;Sn &#xff08;a1an&#xff09;*n/2; 参考代码&#xff1a; #include <iost…

动态规划-----背包类问题(0-1背包与完全背包)详解

目录 什么是背包问题&#xff1f; 动态规划问题的一般解决办法&#xff1a; 0-1背包问题&#xff1a; 0 - 1背包类问题 分割等和子集&#xff1a; 完全背包问题&#xff1a; 完全背包类问题 零钱兑换II: 什么是背包问题&#xff1f; 背包问题(Knapsack problem)是一种…

obspy安装

最近在安装obspy时经常&#xff0c;试了各种方法 conda install obspy pip install obspy 发现都没有办法&#xff0c;包括选择了很多镜像源。 C: \Users admin>conda config -add channels https://mirrors. sustech. edu. cn/anaconda/cloud/biocondal (base)C:\Users…

qtcreator的信号槽链接

在ui文件中简单创建一个信号槽连接并保存可以在ui_mainwindow.h下 class Ui_MainWindow 类 void setupUi(QMainWindow *MainWindow)函数 找到对应代码 QObject::connect(pushButton, SIGNAL(clicked()), MainWindow, SLOT(close())); 下拉&#xff0c;由于 class MainWind…

书生·浦语大模型实战营之全链路开源体系

书生浦语大模型实战营之全链路开源体系 为了推动大模型在更多行业落地开花&#xff0c;让开发者们更高效的学习大模型的开发与应用&#xff0c;上海人工智能实验室重磅推出书生浦语大模型实战营&#xff0c;为广大开发者搭建大模型学习和实践开发的平台&#xff0c;两周时间带…

按大小顺序输出任一三个数据(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现比较函数&#xff1b; int Compare(int a, int b, int c) {//比较a,c的大小&#xff1b;if (a < c){//输出结果&#xff1b;printf("%d > %d &…

如何关闭win10防火墙,怎么关闭win10防火墙通知

Windows10系统自带了防火墙功能,可以有效阻止病毒软件入侵,一般情况下是默认开启的。但是有时候我们下载一些软件,或使用某些功能时,就需要提前将它关闭,以免防火墙阻止正常运作。那么如何关闭win10防火墙呢?网上介绍关于win10系统关闭防火墙的处理方法比较零散,这里小编…