Poj--2185(KMP,二维)

2014-12-13 01:00:47

思路:(吐槽下网上有些题解是的.....从百度文库打印的题解就错了orz...最后还是自己YY出的)

  用KMP求出每行的最小重复字符串长度,求法就是总元素个数 - 最后一个字符的P[]值(与next数组不同概念,这里应该叫覆盖...)

  比如:ABCAB,P[5]=2(假如下标从1开始),那么最小重复字符串长度为5-P[5] = 5-2 = 3,具体为什么这么做要想想P(覆盖数组)的定义(P的含义是最大周期包含长度,所以总长减去它自然就是最小周期长度,在题解POJ 2406中有讨论)

  求的过程中得到每行最小重复字串长度的最大值a,同理能得到每列最小重复字串长度的最大值b,答案就是a×b

 1 /*************************************************************************
 2     > File Name: 2185.cpp
 3     > Author: Natureal
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Fri 12 Dec 2014 04:29:13 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 int R,C,r,c;
28 char g[10010][80];
29 
30 int Solve1(int p){
31     int P[80];
32     P[0] = -1;
33     int j = -1;
34     for(int i = 1; i < C; ++i){
35         while(j > -1 && g[p][j + 1] != g[p][i]) j = P[j];
36         if(g[p][j + 1] == g[p][i]) j++;
37         P[i] = j;
38     }
39     return C - P[C - 1] - 1;
40 }
41 
42 int Solve2(int p){
43     int P[10010];
44     P[0] = -1;
45     int j = -1;
46     for(int i = 1; i < R; ++i){
47         while(j > -1 && g[j + 1][p] != g[i][p]) j = P[j];
48         if(g[j + 1][p] == g[i][p]) j++;
49         P[i] = j;
50     }
51     return R - P[R - 1] - 1;
52 }
53 
54 int main(){
55     scanf("%d%d",&R,&C);
56     for(int i = 0; i < R; ++i){
57         scanf("%s",g[i]);
58     }
59     r = c = 1;
60     for(int i = 0; i < R; ++i){
61         r = max(r,Solve1(i));
62     }
63     for(int i = 0; i < C; ++i){
64         c = max(c,Solve2(i));
65     }
66     printf("%d\n",r * c);
67     return 0;
68 }

 

转载于:https://www.cnblogs.com/naturepengchen/articles/4160831.html

POJ2185_Milking Grid_KMP_二维求最小覆盖子矩阵 【不能用最小公倍数或最大值求覆盖子矩阵的宽和高!!】 昨天看了很久这个题,去POJ 的论坛上,看到几个分析说网上大多数的AC代码都是错的,只是POJ上的数据过于弱就过了,比如求行方向上最小覆盖的列数(宽度)只要用到求最小公倍数的就都是错的,希望大家做此题的时候注意一下,下面题解的时候会解释为什么是错的 题意: 给一个二维的字符串矩阵,求他的一个最小的子矩阵 阅读详情

相关推荐

POJ 2255 java

提示:二叉树遍历而已,给出前序和中序,求后序 解题思路 1、前序遍历的第一个字母必是 根 2、在中序遍历的字母串中找出 根字母,那么根字母左右两边的字符串就分别是它的左、右子树 3、利用递归复原二叉树(把子树看作新的二叉树) 4、后序遍历特征:后序遍历字母串 自右至左 依次为: 最外层(总树,设为第0层)右子树的根,内1层右子树的根,内2层右子树的根….内n层右子树的根,内n层左子树的根,内n-1层左子树的根……内1层左子树的根,最外层(总树,第0层)左子树的根。把总树的左子树作为新的总树,继续递归即可。 (注意:总树的叶就是作为“单叶”这棵树本身的右根) 5、输出后序遍历时,只需按4的顺序从左到右排列,再倒置输出即可

POJ2185 Milking Grid

POJ2185 Milking Grid Time Limit:3000MS Memory Limit:65536K Total Submissions:3220 Accepted:1317 Description Every morning when they are milked, the Farmer John's co...

weixin_30826095的博客 190

【AI开源】Understand-Anything 完整使用教程(2026最新版)

Understand-Anything是一款基于交互式知识图谱的AI学习与开发平台,能够将代码库转化为可视化知识结构,支持语义搜索、上下文问答和全流程开发。核心功能包括代码知识图谱化、AI辅助学习和多编码代理集成。支持TypeScript/JavaScript、Python等多种语言,要求Node.js 20+和16GB以上内存。提供NPM、Docker和源码三种安装方式,支持增量更新和团队知识共享。与同类产品相比,在交互式图谱、语义搜索和AI集成方面更具优势。适用于代码学习、大型项目维护和团队协作等场景。

与时俱进,开放共享 7215

POJ 2185 正解 KMP

题意: 思路: 把每一行压成一个数 求一下 KMP 把每一列压成一个数 求一下KMP 答案就是两个周期之积 网上的好多题解都是错的……………………….. //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using nam...

weixin_34319640的博客 147

NOAA气象数据下载攻略

各方搜寻气象数据下载途径,发现网上最多的就是从NOAA下载,但是中途有尝试过很多次都没有下载到,每次都是显示不可用,今天终于下载成功了,特此记录。 首先我是从这个网址进入的:National Centers for Environmental Information (NCEI) formerly known as National Climatic Data Center (NCDC) | NCEI offers access to the most significant archives of oc

lianqian66的博客 3万+

让AI稳定生成流程图:基于Skill与Mermaid的工程化实践

流程图是软件工程中沟通业务逻辑的通用语言,但其绘制与维护却长期依赖手工工具,导致文档更新滞后、协作成本高。随着大语言模型技术的成熟,自然语言生成代码已成为可落地的技术路径,而Mermaid作为一款文本化图表语法,凭借其可版本管理、可自动渲染和可嵌入文档的优势,正逐步取代传统绘图工具。要让AI稳定输出合格的流程图,关键在于为模型定义一套清晰的Skill规则,约束输入结构、处理逻辑和输出格式。本文从流程图的工程痛点出发,介绍如何利用大模型将自然语言描述转化为结构化文本,再通过Mermaid CLI渲染成可视化图

weixin_42548782的博客 310

poj2185(kmp)

题目链接: http://poj.org/problem?id=2185 题意: 给出一个矩形字符块, 求能组成该矩形块的最小子矩形块. 思路: 将每行字符串当作一个字符,那么原矩形字符块就成了一列字符,其最小循环节即为所求矩形块的宽; 将每列字符串当作一个字符,那么原矩形字符块就成了一行字符,其最小循环节即为所求矩形的长. 代码: 1 #include &l...

weixin_30819085的博客 222

Matlab实战:3种雷达间歇采样干扰的仿真与识别(附完整代码)

本文通过Matlab实战,详细仿真了雷达有源间歇采样干扰的三种核心样式:直接转发、重复转发和循环转发干扰。文章提供了完整的代码实现,并深入探讨了基于时频分析和循环平稳分析的特征提取与识别方法,为雷达抗干扰技术的学习与实践提供了清晰的工程实现路径。

weixin_29053695的博客 364

题解 POJ2185 【Milking Grid】

题目链接:Link Problem Solution 显然,最终的划分方法在每一行中都必须满足。 求最小循环节是KMP的基本应用之一,我们可以O(nm)求出每一行、每一列的最小循环节长度,分行和列求出它们的lcm,最终再乘起来即可。 注意:如果取lcm的时候发现值已经大于等于原来的长度了,就不用考虑循环了。 Code #include<cstdio> #include&lt...

donglaishi1835的博客 165

(程序设计方法与实践)达拉崩吧的酒宴

达拉崩吧的酒宴 Description 很久很久以前,巨龙突然出现,带来灾难带走了公主又消失不见,王国十分危险,世间谁最勇敢,一位勇者赶来大声喊:“我要带上最好的剑,翻过最高的山,闯进最深的森林,把公主带回到面前”……最后,英雄 达拉崩巴斑得贝迪卜多比鲁翁 ,他战胜了巨龙 昆图库塔卡提考特苏瓦西拉松 ,国王把公主 米娅莫拉苏娜丹妮谢莉红 嫁给了 达拉崩巴斑得贝迪卜多比鲁翁 。 于是国王第二天要在 蒙达鲁克硫斯伯古比奇巴勒城 举办酒宴,一共准备了 N 桶酒。此时一位忠诚的仆人来报,有人在其中一桶酒里下毒,

What_If_I的博客 892

MOOS-ivp 实验一 MOOS软件的安装与执行

MOOS-ivp实验一 实验一步骤总结 文章目录MOOS-ivp实验一前言一、实验一1.下载软件2.安装必要的插件3.安装后检查4.路径添加5.执行示例文件总结 前言 在moos学习过程中,我觉得最好把学习的每一步骤都总结一下,方便日后进行回顾。moos官网设置了十八个实验,涉及到了moos的各个方面,完成这些实验也是moos入门的好办法。 一、实验一 实验一主要内容仅仅是软件的安装,仅仅这一步就花费了我接近两天的时间。主要问题发生在linux系统的配置问题上。 1.下载软件 svn co https:

weixin_44151170的博客 6669

POJ2185 最小覆盖矩阵 (二维KMP)

这题挺有意思的,主要把KMP理解透彻了,其实二维的可以看成一维的,原来是由单个字符组成的字符串,现在就是由字符串组成的字符串数组,在此基础上,其他操作和思想都是一样的,横向求一遍next数组,那么最小的可覆盖的子串长度为:len-next[len],同理再求一遍纵向的,相乘即可。#include<iostream> #include<stdio.h> #include<string.h> using

qq_33688997的博客 895

simulink中无迹卡尔曼(UKF)模块使用

simulink的UKF模块简单说明

qq_41059950的博客 2820

POJ 2185 二维KMP

题意:就是让你求出最小的字符矩阵面积,这个矩阵是这个大矩阵里能够循环的,但是并不一定是全部循环相同的,部分相同也算循环,比如样例。 思路:这题挺好的,以前没有想到二维字符串数组也可以用next数组求出其循环节,现在这题正好补了这个空。 解法:把每一个字符串当做字符进行求next数组,然后求出最小的循环字符串长度,即:len-next[len]。因为以前求循环节是len/(len-next[le

liwei的专栏 1202

【软考高级架构】论文范文12——论生成式AI在软件开发中的应用与挑战

随着生成式AI技术的跨越式发展,以大语言模型为代表的生成式AI正在深刻改变软件开发的传统模式。在代码生成、测试构造、文档编写等环节,生成式AI展现出显著的效率提升潜力,但其应用也面临着代码质量不可控、安全漏洞植入、版权合规等严峻挑战。本文以笔者主导的某大型金融企业智能研发辅助平台建设项目为案例,围绕生成式AI在软件开发中的应用实践与应对挑战的策略展开论述。笔者担任系统架构师,负责平台架构设计、模型选型、质量保障机制及安全防线构建。

qq837993702的博客 275

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

poj 2185 二维kmp

题意:求最小的模式块,使其无限扩展后包含给你的矩阵块(看别人题解才懂的题意); 分析:假设存在一个模式块可以满足上述条件,那么必然存在一个起点在(0,0)的模式块满足上述条件; 对于每一行,我们找出所有可以满足条件的前缀记录下长度,那么满足所有行的最短的长度就是该模式块的宽r; 对于模式块的长,我们把宽r的字符串压缩看出一个字符,然后再进行KMP,找出该字符串的最小循环串,即长l; 答案就是r *...

Fawkess的博客 310

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

POJ 2185 Milking Grid 二维kmp

题意:给出一个矩阵,求最小的子矩阵,使得原矩阵包含在子矩阵的某个扩展中。 比如 ABABA ABABA 就是被包含在AB扩展的矩阵中。 输出这个最小的子矩阵的大小。 其实只要两遍KMP就行了,把每行当成一个字符KMP一遍求最小循环子串的规模,然后在那几行子矩阵中把每列矩阵当成一个字符再求一遍最小循环子串。 代码: /* * Author: illuz

水果君の日常 2227

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

POJ 2185 Milking Grid 二维KMP

点击打开链接 题意:R*C字符矩阵,R 若为一维,则相当于用kmp求出最小循环节(只要求覆盖,len%(len-next[len])可以不为0) 先对每行求最小循环节xi,子矩形的宽度最小为:xi(i=1~r)的最小公倍数lr. 在对每列求最小循环节yi 子矩形的高度最小为:yi(i=1~c)的最小公倍数lc. 以lr*lc子矩阵为单位显然能覆盖整个字符矩阵 #include #

Masamiiiiii 526

POJ 2185 二维kmp算法

http://poj.org/problem?id=2185 Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that is R (1 <= R <= 10,000) rows by C (1 <= C <= 75) columns. As we

ACM,再见! 1401

poj2185 Milking Grid 二维kmp

给一个字符矩阵,求一个最小的矩阵,使得这个矩阵复制若干次可以完整包含原矩阵。首先考虑行,找出每行的最小重复单元的长度后,他们的最小公倍数就是横向上的最小单元长度;同理纵向上求出纵向上的最小单元长度,要注意的一点是如果这两个长度大于n或m得话,就取n或m,因为最长也就是他们本身的长度..那么现在的问题就是求一行(或一列)的最小重复单元了,求出该行的失配函数,len-f[len]就是这一行的最小重复单

Broken Wings 852

POJ_2185_二维KMP

http://poj.org/problem?id=2185 求最小覆盖矩阵,把KMP扩展到二维,行一次,列一次,取最小覆盖线段相乘即可。 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespa...

diaotan0836的博客 103

POJ 2185 Milking Grid(二维KMP)

超级传送门:http://poj.org/problem?id=2185 这道题网上很多其他的blog上的题解都是错的,由于题目自身数据比较水,便都混过去了。其中一种典型的错误解法是求出每一行/列的最小覆盖长度(ABCAB的最小覆盖长度就是3,即对应ABC),然后LCM,若结果大于串长,则取串长。这是一种典型的错误贪心,诸如: 2 8 ABCDEFAB AAAABAAA 这组数据

Uranux 1232

poj 2185 Milking Grid(最小矩阵覆盖,二维 kmp 匹配)

题目:http://poj.org/problem?id=2185 题目大意:给你一个二维字符串矩阵,问你最小的覆盖矩阵的大小。 思路:好题啊,绝对的kmp好题!具体解题思想可以参考这个网址:http://blog.sina.com.cn/s/blog_69c3f0410100tyjl.html,这个才是真犀利,先暴力求出每行的可能 的子串,然后选择一个最小的,那么着肯定是最小的列数,然后对

沉溺的专栏 897

字符串——广义&二维KMP

字符串——广义&二维KMP 广义KMP 普通KMP是关于字符序列的一种模式匹配算法,而广义KMP将字符序列推广到一般序列,即带有等价关系的序列均可以进行广义KMP算法。 即我们只需要定义序列中的元素是否相等或不相等,即可像普通KMP一样执行广义KMP算法。 二维KMP 广义KMP的一种特殊实现就是二维KMP,在二维KMP中的序列元素就是字符串。例如序列{“abcd”,“addfd”,“dwffas”},我们可以定义字符串相等,那么就可以在字符串序列上执行广义KMP算法,即二维KMP算法。 POJ 2

jiahonghao2002的博客 696

POJ 2185 KMP 二维字符串找最短循环矩阵

主要思想就是降维处理。 相似题目: HDU 3746:一维字符串找最短循环节,这道题是HDU3746的升级版,增加了一个维度。 题意: 一个字符矩阵看成一个地面,然后把最短循环矩阵看成瓷砖,需要铺满地面,地面的边缘部分,瓷砖可以残缺。 题解: 我们不防把最短循环矩阵拆分成,行的最短循环节,列的最短循环节。 还是直接举例子吧,比较清楚些。 A B A ...

shadandeajian的博客 350
上一篇: Poj--2406(KMP,周期)
下一篇: CF #282 div1
dingdi3021
博客等级 码龄11年 1粉丝 230原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值