二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
Milking Grid #
Problem's Link:http://poj.org/problem?id=2185#
Mean:
给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最小覆盖矩阵的面积。
analyse:
做了上一篇博客的题目,就会求一个字符串的最小覆盖矩阵。同样的,现在求字符矩阵的最小覆盖矩阵,只是将一维推向了二维,我们在纸上画一下图,你会发现,其实二维的也是so easy!
我们将每一行的字符串的最小覆盖子串求出来,然后对这n个数求LCM,那么结果就是行覆盖的最小覆盖子串;同样的我们再对每一列求最小覆盖子串,然后对这m个数求LCM,那么结果就是列覆盖的最小覆盖子串。
最后的答案:area=两个数的乘积。
Time complexity:O(n*m)
Source code:
// Memory Time // 1347K 0MS // by : Snarl_jsb // 2014-10-03-20.59 #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<stack> #include<map> #include<string> #include<climits> #include<cmath> #define N 1000010 #define LL long long using namespace std; char str[10010][100],tmp[10010]; int row[10010],col[100]; vector<int> next; void GetNext(char str[]) { // puts(str); next.clear(); next.push_back(0); int len=strlen(str); int k=0; for(int i=1;i<len;++i) { while(k!=0&&str[i]!=str[k]) k=next[k-1]; if(str[i]==str[k]) k++; next.push_back(k); } // for(int i=0;i<len;++i) // cout<<next[i]<<endl; } int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int lcm(int a,int b) { return a*b/gcd(a,b); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); // freopen("C:\\Users\\ASUS\\Desktop\\cin.cpp","r",stdin); // freopen("C:\\Users\\ASUS\\Desktop\\cout.cpp","w",stdout); int r,c; cin>>r>>c; for(int i=0;i<r;++i) { scanf("%s",str[i]); } int len; len=c; for(int i=0;i<r;++i) { GetNext(str[i]); row[i]=len-next[len-1] ; } len=r; for(int i=0;i<c;++i)//列 { for(int j=0;j<r;++j)//行 { tmp[j]=str[j][i]; } GetNext(tmp); col[i]=len-next[len-1]; } int r1=row[0]; for(int i=1;i<r;++i) { r1=lcm(r1,row[i]); if(r1>c) { r1=c; break; } } int c1=col[0]; for(int i=1;i<c;++i) { c1=lcm(c1,col[i]); if(c1>r) { c1=r; break; } } // cout<<r1<<endl; // cout<<c1<<endl; cout<<r1*c1<<endl; return 0; }
作者:北岛知寒
出处:https://www.cnblogs.com/crazyacking/p/4005399.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?