字符串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 ...
随机推荐
- Get与Post的小知识
Get与Post的小知识 一.传递参数: Get把参数包含在URL中,而在Post通过request body传递参数.因为参数直接暴露在URL上,GET比POST更不安全,所以不能用来传递敏感信息. ...
- Ruby 类的创建
class Language def initialize(name, creator) @name = name @creator = creator end def description pu ...
- 什么是位、字节、字、KB、MB?
1. 位(bit)是计算机里最小的数据单位,每一位的状态只能是0或者1 2. 字节(Byte) 1Byte = 8 bit 它是存储空间的基本计量单位,1byte可以存储一个英文字 ...
- 安装Nginx作为文件服务器
我是在Windows上安装的,在Linux上也一样 #Windows server2008 R2 #Nginx1.12 Nginx安装包下载地址:http://nginx.org/en/downloa ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 02. Web Host 的默认配置
视频地址: https://www.bilibili.com/video/av38392956/?p=2 语雀 https://www.yuque.com/yuejiangliu/dotnet/ixt ...
- Android Studio编译开源项目(含NDK开发)常见报错
1.未设置NDK的路径 Error:Execution failed for task ':library:ndkBuild'. > A problem occurred starting pr ...
- STM32CUBEMX使用注意:
一 注意堆栈大小,简单来说,栈空间用于局部变量空间(size=0x400一般够用),堆(size=0x200一般够用)空间用于 alloc 或者 malloc函数动态申请变量空间
- AWK整理
处理模式: awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作.如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如 ...
- 牛客网Java刷题知识点之自动拆装箱
不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=5 ...
- python实战之爬取喜玛拉雅专辑信息
import urllib.request import json from lxml import etree url='http://www.ximalaya.com/dq/8.ajax' hea ...