KMP水题
来源:互联网 发布:萨德对中国的影响 知乎 编辑:程序博客网 时间:2024/06/10 22:25
POJ2185,题意大概是找出最小矩阵可以通过复制覆盖原矩阵。
先用KMP算出每行可行重复长度,找出所有行都可行的最小长度k,
在把每行字符串的开头k个字符当做一个字符跑一边KMP,r-next[r]即最小宽。长乘宽即为所求~~~
#include <cstdio>#include <algorithm>#include <cstring>#define INF 233333333333using namespace std;char s[10010][100];int f[10010],r,c,len,next[10010],ll,rr;void get_next(char* s){ len=strlen(s); memset(next,-1,sizeof(next)); for (int i=1;i<len;i++) { int j=next[i-1]; while (j!=-1&&s[j+1]!=s[i]) j=next[j]; if (s[j+1]==s[i]) next[i]=j+1; }}int main(){ scanf("%d%d",&r,&c); ll=rr=INF; for (int i=1;i<=r;i++) { scanf("%s",s[i]); get_next(s[i]); int t=len-1-next[len-1]; for (int i=t;i<=len;i+=t) f[i]++; } for ( ll=0;ll<c;ll++) if (f[ll]==r) break; memset(next,0,sizeof(next)); for (int i=2;i<=r;i++) { int j=next[i-1]; while (j!=0&&strcmp(s[j+1],s[i]))j=next[j]; if (!strcmp(s[j+1],s[i])) next[i]=j+1; } printf("%d",ll*(r-next[r]));}
0 0
- KMP水题
- KMP水题
- poj 3080 kmp水题
- hdu4763(kmp水题)
- Oulipo poj+KMP水题
- hdu2203 KMP水题
- hdu1686 KMP水题
- poj2752 KMP水题
- hdu2594(KMP水题)
- KMP
- KMP
- KMP
- KMP
- KMP
- KMP
- kmp
- kmp
- KMP
- java多线程常用的类
- 全面解析Android EditText以及软键盘的设置
- Python知识点备忘(1)
- 线段树模板
- 安卓学习随笔(1)
- KMP水题
- LeetCode Summary Math
- Servlet拦截静态图片的解决方案
- leetcode_middle_36_436. Find Right Interval
- 设置resin在linux下的默认启动
- lacp协议文档概要
- LeetCode Summary Search
- 一步一步教你怎么将AndroidLibrary提交到JCenter仓库,2017年最新版方法,解决各种坑!
- Linux基础知识学习常用视频链接