博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2185 Milking Grid KMP循环节周期
阅读量:6308 次
发布时间:2019-06-22

本文共 1168 字,大约阅读时间需要 3 分钟。

题目来源:

题意:至少要多少大的子矩阵 能够覆盖全图

比如例子 能够用一个AB 组成一个

ABABAB

ABABAB 能够多出来

 

思路:每一行求出周期 总共n个 求这n个周期的最小公倍数 假设大于m 取m

           每一列求出周期 总共m个求这个m个周期的最小公倍数 假设大于n取n

答案就是2个最小公倍数的积

#include 
#include
#include
#include
using namespace std;const int maxn = 10010;char a[maxn][77];char b[77][maxn]; int f[maxn][77];int f2[77][maxn];int gcd(int a, int b){ return b?gcd(b, a%b):a;}void getFail(char* p, int* f){ int m = strlen(p); f[0] = f[1] = 0; for(int i = 1; i < m; i++) { int j = f[i]; while(j && p[i] != p[j]) j = f[j]; f[i+1] = p[i] == p[j] ? j+1 : 0; }}int main(){ int n, m; scanf("%d %d", &n, &m); for(int i = 1; i <= n; i++) { scanf("%s", a[i]); getFail(a[i], f[i]); } for(int i = 0; i < m; i++) { for(int j = 1; j <= n; j++) { b[i+1][j-1] = a[j][i]; } b[i+1][n] = 0; } for(int i = 1; i <= m; i++) getFail(b[i], f2[i]); int ans1 = 1, ans2 = 1; for(int i = 1; i <= n; i++) { ans1 = ans1/gcd(ans1, m-f[i][m])*(m-f[i][m]); if(ans1 > m) { ans1 = m; break; } } for(int i = 1; i <= m; i++) { ans2 = ans2/gcd(ans2, n-f2[i][n])*(n-f2[i][n]); if(ans2 > n) { ans2 = n; break; } } printf("%d\n", ans1*ans2); return 0;}

 

 

 

转载地址:http://zaxxa.baihongyu.com/

你可能感兴趣的文章
6421B Lab2 DHCP的配置及故障排除
查看>>
HDFS 实验 (一) 原理
查看>>
Powershell 自定义输出列,两个例子
查看>>
XenServer虚拟机最佳实践
查看>>
Python 学习笔记 - SQLAlchemy(下)
查看>>
不仅要提高技术,还要提高综合素质
查看>>
当网络安全遇上大数据分析(1)
查看>>
TechDE 2011,无商不“虚”
查看>>
rhel6.5网卡初始化错误解决
查看>>
配置Windows Server 2008群集
查看>>
演示:三层以太通道的配置
查看>>
Preparing Active Directory Domain Services for Lync Server 2010
查看>>
Exchange Server 2016管理系列课件40.DAG部署之网卡准备
查看>>
生产环境上线程序导致服务故障案例解析
查看>>
SFB 项目经验-19-Skype for business-不好用-别-都怪它
查看>>
AIX下was进程占用CPU率较高实例深解析
查看>>
运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(二)
查看>>
选择软文发布需要注意的问题
查看>>
基于WinSvr2012共享文件夹的Hyper-V实时迁移之三实时迁移的实现及验证
查看>>
Lync Server 2010的部署系列(三) lync批量导入用户联系人
查看>>