字符串KMP || POJ 2185 Milking Grid
求一个最小矩阵,经过复制能够覆盖原矩阵(覆盖,不是填充,复制之后可以有多的)
*解法:横着竖着kmp,求最大公倍数的做法是不对的,见http://blog.sina.com.cn/s/blog_69c3f0410100tyjl.html
正解如http://poj.org/showmessage?message_id=153316
求出每一行的可以重复的子串长度,所有行都可以的(公共的)那个最小的长度就是最终所求矩阵的宽
求出宽之后把剩下那些列砍掉,然后要求矩阵的高,把每行看作一个整体kmp即可
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define SZ 10005
int nxt[SZ];
char s[SZ][80], tmp[80];
int r, c, k, cnt[80];//cnt相当于桶,记录每个长度出现多少次,如果一个长度出现r次即表示这个长度在每行都出现过,即为最终矩阵的宽
void get_next(char p[], int plen)
{
int i = 0, j = -1;
nxt[0] = -1;
while(i < plen)
{
if(j == -1 || p[i] == p[j])
{
i++;
j++;
nxt[i] = j;
}
else j = nxt[j];
}
k = c - nxt[plen];//后缀
cnt[k]++;
if(k == c) return;
for(int i = 0; i < nxt[plen]; i++)
tmp[i] = p[i + plen - nxt[plen]];//把后缀拿出来,再kmp
get_next(tmp, nxt[plen]);
return;
}
void get_next_str(char p[][80], int plen)
{
int i = 0, j = -1;
nxt[0] = -1;
while(i < plen)
{
if(j == -1 || strcmp(p[i], p[j]) == 0)//把每行看作一个整体
{
i++;
j++;
nxt[i] = j;
}
else j = nxt[j];
}
return;
}
int main()
{
scanf("%d %d", &r, &c);
for(int i = 0; i < r; i++)
scanf(" %s", s[i]);
for(int i = 0; i < r; i++)
get_next(s[i], c);
for(int i = 0; i < c; i++)
if(cnt[i] == r)
{
c = i;//i长度出现了r次,即为最终的宽
break;
}
for(int i = 0; i < r; i++)
s[i][c] = '\0';//把剩下的列砍掉
get_next_str(s, r);
printf("%d\n", c * (r - nxt[r]));
return 0;
}
字符串KMP || POJ 2185 Milking Grid的更多相关文章
- POJ 2185 Milking Grid KMP循环节周期
题目来源:id=2185" target="_blank">POJ 2185 Milking Grid 题意:至少要多少大的子矩阵 能够覆盖全图 比如例子 能够用一 ...
- POJ 2185 Milking Grid [二维KMP next数组]
传送门 直接转田神的了: Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6665 Accept ...
- [poj 2185] Milking Grid 解题报告(KMP+最小循环节)
题目链接:http://poj.org/problem?id=2185 题目: Description Every morning when they are milked, the Farmer J ...
- POJ 2185 Milking Grid(KMP)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4738 Accepted: 1978 Desc ...
- POJ 2185 Milking Grid KMP(矩阵循环节)
Milking Grid Time Limit: 3000MS Memory Lim ...
- 题解报告:poj 2185 Milking Grid(二维kmp)
Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...
- POJ 2185 Milking Grid [KMP]
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8226 Accepted: 3549 Desc ...
- poj 2185 Milking Grid
Milking Grid http://poj.org/problem?id=2185 Time Limit: 3000MS Memory Limit: 65536K Descript ...
- POJ 2185 Milking Grid (KMP,求最小覆盖子矩阵,好题)
题意:给出一个大矩阵,求最小覆盖矩阵,大矩阵可由这个小矩阵拼成.(就如同拼磁砖,允许最后有残缺) 正确解法的参考链接:http://poj.org/showmessage?message_id=153 ...
随机推荐
- 【旧文章搬运】ZwQuerySystemInformation枚举进线程信息
原文发表于百度空间,2008-10-15========================================================================== 很古老的东 ...
- const常量
1.不能给常量赋值 ; a=; 编译器报错:“a”: 不能给常量赋值
- Hibernate自定义字段查询
关于Hibernate自定义字段查询的方法,网上有很多,我这里就不详细写了,只把几个查询方法的注意事项说明一下. 废话少说, 进入正题: 假设有2个实体对象,Institution和User,结构与配 ...
- juju入门
https://jujucharms.com/docs/1.25/config-LXC Installation(Ubuntu) #sudo add-apt-repository ppa:juju/s ...
- docker 远程连接设置
Docker为C/S架构,服务端为docker daemon,客户端为docker.service. 默认不会监听任何端口,只能在本地使用docker客户端或者使用Docker API进行操作.要支持 ...
- Windows可以ping通百度,但是用浏览器打不开网页
开始——>运行——>输入cmd回车——>输入: netsh winsock reset 命令(重置winsock文件)——>重启系统. 重启完系统,即可解决:如不能,请再查找 ...
- 2016 Multi-University Training Contest 1Abandoned country
qaq,现在内心真是各种草泥马.怪自己见识短浅...哎... 题意: 给你一幅图,然后求一个最小花费使得所有的点都连通(这就是最小生成树啊),然后在这棵树上[如果我要从任意起点到任意终点,这两个点不同 ...
- POJ1458【最长公共子序列】
基础DP. #include <iostream> #include <stdio.h> #include <string.h> #include <stac ...
- bzoj 3872: [Poi2014]Ant colony【树形dp+二分】
啊我把分子分母混了WA了好几次-- 就是从食蚁兽在的边段成两棵树,然后dp下去可取的蚂蚁数量区间,也就是每次转移是l[e[i].to]=l[u](d[u]-1),r[e[i].to]=(r[u]+1) ...
- wamp2.5版本配置多端口虚拟主机
1.保证httpd.conf下 LoadModule php5_module "D:/E/php/wamp/bin/php/php5.5.12/php5apache2_4.dll" ...