POJ 2185 Milking Grid
2014-03-28 20:00
211 查看
利用next数组求最小重复覆盖字串长度,即x = len - next[len]。先求每行最小长度再求每行最小公倍数,纵横相乘可过。
PS:以上是错误思路,仅为理解next数组。目测这篇文章是正解:http://blog.sina.com.cn/s/blog_69c3f0410100tyjl.html
sss
PS:以上是错误思路,仅为理解next数组。目测这篇文章是正解:http://blog.sina.com.cn/s/blog_69c3f0410100tyjl.html
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; #define N 10005 char a [80]; int next ; int cans, rans; char b ; int r, c; void getnext(char * sub){ int i = 0; int j = -1; next[0] = -1; while(sub[i]){ if(j == -1 || sub[i] == sub[j]){ j++; i++; if(sub[i] == sub[j])next[i] = next[j];//此处的优化不影响结果,next[len]不可能为-1; else next[i] = j; } else j = next[j]; } } int gcd(int a, int b){ int ret = a % b; int mut = a * b; while(ret){ a = b; b = ret; ret = a % b; } return mut / b; } int main(){ while(scanf("%d%d", &r, &c) != EOF){ for(int i = 0; i < r; i++) scanf("%s", a[i]); for(int i = 0; i < r; i++){ getnext(a[i]); int x = c - next[c]; if(i == 0)cans = x; else cans = min(c, gcd(x, cans)); } for(int i = 0; i < c; i++){ for(int j = 0; j < r; j++){ b[j] = a[j][i]; } b[r] = 0; getnext(b); int x = r - next[r]; if(i == 0)rans = x; else rans = min(r, gcd(x, rans)); } printf("%d\n", rans * cans); } return 0; }
sss
相关文章推荐
- POJ-2185-Milking Grid
- POJ 2185 Milking Grid KMP循环节周期
- POJ 2185 Milking Grid
- AC日记——Milking Grid poj 2185
- POJ - 2185 - Milking Grid
- POJ 2185 Milking Grid KMP循环节周期
- poj 2185 Milking Grid
- poj 2185 Milking Grid KMP
- poj 2185 Milking Grid
- poj 2185 Milking Grid KMP
- POJ 2185 Milking Grid
- POJ 2185 Milking Grid + kmp的巧妙应用
- poj 2185 Milking Grid
- Match:Milking Grid(二维KMP算法)(POJ 2185)
- pku2185 Milking Grid 2012-01-11
- POJ Milking Grid 【最小覆盖矩阵,next[]】
- POJ 2455-Secret Milking Machine(网络流_最大流+二分查找)
- Milking Time POJ - 3616
- POJ 1942 Paths on a Grid
- POJ 1942 Paths on a Grid 组合以及处理阶乘