/*
特征值k=m-next[m]就是最小循环节的长度,
m%k就是去末尾遗留长度
*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; char strs[][];
int r,c,w,h,f[],nxt[];//r是行,c是列 void kmp_pre1(char *s){//求一行的nxt数组
int nxtt[]={};
int m=strlen(s);
int i,j;
i=;j=nxtt[]=-;
while(i<m){
while(j!=- && s[i]!=s[j]) j=nxtt[j];
nxtt[++i]=++j;
}
//把可行的长度都在f中+1
int tmp=m-nxtt[m],k=;
while(k+tmp<=m){
k+=tmp;
f[k]++;
}
//剩下的串枚举一次开头就好
for(k=m%(m-nxtt[m]);k;k=nxtt[k]){
f[m-nxtt[k]]++;
}
} void kmp_pre2(){
memset(nxt,,sizeof nxt);
int i,j;
i=,j=nxt[]=-;
while(i<r){
while(j!=- && strcmp(strs[i],strs[j])!=)
j=nxt[j];
nxt[++i]=++j;
}
}
int main(){
while(scanf("%d%d",&r,&c)==){
memset(f,,sizeof f);//宽度为i的子串出现的次数
w=c,h=r; for(int i=;i<r;i++){
scanf("%s",strs[i]);
kmp_pre1(strs[i]);
}
for(int i=;i<=c;i++)//找到矩阵最小宽度
if(f[i]==r){w=i;break;} for(int i=;i<r;i++)
strs[i][w]='\0';//截取前w个字符 kmp_pre2();//获取在行之间的next数组
h=r-nxt[r];//h就是列上的特征值 printf("%d\n",w*h);
}
return ;
}

poj2185 kmp求最小覆盖矩阵,好题!的更多相关文章

  1. 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185

    Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...

  2. POJ 2185 Milking Grid (KMP,求最小覆盖子矩阵,好题)

    题意:给出一个大矩阵,求最小覆盖矩阵,大矩阵可由这个小矩阵拼成.(就如同拼磁砖,允许最后有残缺) 正确解法的参考链接:http://poj.org/showmessage?message_id=153 ...

  3. HDU 3746 Cyclic Nacklace (KMP求循环节问题)

    <题目链接> 题目大意: 给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数. [>>>kmp next函数 kmp的周期问题]  #include &l ...

  4. KMP算法 - 求最小覆盖子串

    KMP与最小覆盖子串 最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串. 比如: 对于s="abcab&quo ...

  5. 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)

    [BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...

  6. hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)

    传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...

  7. 剪花布条 HDU - 2087(kmp,求不重叠匹配个数)

    Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入 ...

  8. hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)

    Problem - 3374   KMP求循环节. http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html   循环节推导的证明相当 ...

  9. [KMP求最小循环节][HDU1358][Period]

    题意 求所有循环次数大于1的前缀 的最大循环次数和前缀位置 解法 直接用KMP求最小循环节 当满足i%(i-next[i])&&next[i]!=0 前缀循环次数大于1 最小循环节是i ...

随机推荐

  1. Mysql经典sql语句大全

    DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete,Update,Insert) DCL-数据控制语言(GRANT,REVOK ...

  2. Hadoop生态圈-HUE环境部署

    Hadoop生态圈-HUE环境部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.HUE简介 1>.HUE的由来 HUE全称是HadoopUser Experienc ...

  3. my phone blackberry classic / passport / priv / keyone

    smy blackberry classic PIN: 2BF66A72 / 查看手机位置https://protect.blackberry.com/protect/mydevice#BlackBe ...

  4. JavaSE学习总结(五)——封装,继承,多态很简单

    java面向对象的三大特性是:封装.继承与多态,是面向对象编程的核心. 一.封装 简单说封装就是将同一类事物的特性与功能包装在一起,对外暴露调用的接口. 封装:封装也称信息隐藏,是指利用抽象数据类型把 ...

  5. idea出现乱码问题

    Intellij Idea打包工程时控制台显示乱码 这主要是maven编译时编码问题导致的.在Intellij的settings中maven的run配置中设置它的VM Options为-Darchet ...

  6. synchronized的一些记录

    1.方法内的私有变量,不存在线程安全问题.非线程安全问题存在于实例变量(全局变量)中 2.在方法上加synchronized表示,当第一个线程进入时方法加锁(其他方法无法调用) 3.synchroni ...

  7. Linux重启服务器步骤

  8. 转--python 面试题

    # 每一题都值得好好琢磨钻透 [原文地址](http://www.cnblogs.com/Allen-rg/p/7693394.html)1.Python是如何进行内存管理的? 答:从三个方面来说,一 ...

  9. ARMCortex系列仿真调试器

    主流的调试工具1.  J-LinkJ-Link是最著名的ARM开发调试工具,J-Link由SEGGER公司生产.提供对市面上几乎所有ARM内核芯片的支持.目前最新版本的J-Link产品为V8,支持JT ...

  10. ettercap中间人攻击--参数介绍

    攻击和嗅探  -M,  --mitm ARP欺骗,参数 -M arp remote    # 双向模式,同时欺骗通信双方,-M arp:remote. oneway   #单向模式,只arp欺骗第一个 ...