模板

caioj 1177 KMP模板

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1e6 + 10;
const int MAXM = 1e3 + 10;
char a[MAXN], b[MAXM];
int next[MAXM], lena, lenb; void get_next()
{
next[1] = 0; int j = 0;
_for(i, 2, lenb)
{
while(j > 0 && b[j + 1] != b[i]) j = next[j];
if(b[j + 1] == b[i]) j++;
next[i] = j;
}
} void kmp()
{
int j = 0;
_for(i, 1, lena)
{
while(j > 0 && (j == lenb || b[j + 1] != a[i])) j = next[j];
if(b[j + 1] == a[i]) j++;
if(j == lenb) { printf("%d %d\n", i - lenb + 1, i); return; }
}
puts("NO");
} int main()
{
scanf("%s%s", a + 1, b + 1);
lena = strlen(a + 1); lenb = strlen(b + 1);
get_next();
kmp();
return 0;
}

caioj 1460: 【KMP】字符串匹配

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1e6 + 10;
char a[MAXN], b[MAXN];
int next[MAXN], lena, lenb; void get_next()
{
next[1] = 0; int j = 0;
_for(i, 2, lena)
{
while(j > 0 && a[j + 1] != a[i]) j = next[j];
if(a[j + 1] == a[i]) j++;
next[i] = j;
}
} int kmp()
{
int res = 0, j = 0;
_for(i, 1, lenb)
{
while(j > 0 && a[j + 1] != b[i]) j = next[j];
if(a[j + 1] == b[i]) j++;
if(j == lena) { res++; j = next[j]; }
}
return res;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s%s", a + 1, b + 1);
lena = strlen(a + 1); lenb = strlen(b + 1);
get_next();
printf("%d\n", kmp());
}
return 0;
}

重复子串结论

有一个结论。

对于字符串S[1~i],如果i % (i - next[i]) == 0,那么这个字符串就由很多个重复的子串构成(形如abababab)

每个循环节等于S[1~i-next[i]],循环节的个数为i / (i - next[i])

这个结论很好证明,用笔画一下就可以发现这个性质

caioj 1457: 【KMP】重复的子串

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1e6 + 10;
char a[MAXN];
int next[MAXN], lena; void get_next()
{
next[1] = 0; int j = 0;
_for(i, 2, lena)
{
while(j > 0 && a[j + 1] != a[i]) j = next[j];
if(a[j + 1] == a[i]) j++;
next[i] = j;
}
} int main()
{
while(scanf("%s", a + 1))
{
if(a[1] == '.') break;
lena = strlen(a + 1);
get_next();
if(lena % (lena - next[lena]) == 0)
printf("%d\n", lena / (lena - next[lena]));
else puts("1");
}
return 0;
}

caioj 1458: 【KMP】判断循环段位置

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1e6 + 10;
char a[MAXN];
int next[MAXN], lena; void get_next()
{
next[1] = 0; int j = 0;
_for(i, 2, lena)
{
while(j > 0 && a[j + 1] != a[i]) j = next[j];
if(a[j + 1] == a[i]) j++;
next[i] = j;
}
} int main()
{
scanf("%s", a + 1);
lena = strlen(a + 1);
get_next();
_for(i, 2, lena)
if(i % (i - next[i]) == 0 && i / (i - next[i]) > 1)
printf("%d %d\n", i, i / (i - next[i]));
return 0;
}

next数组应用

caioj 1459: 【KMP】所有前缀等于后缀的情况

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1e6 + 10;
char a[MAXN];
int next[MAXN], lena; void get_next()
{
next[1] = 0; int j = 0;
_for(i, 2, lena)
{
while(j > 0 && a[j + 1] != a[i]) j = next[j];
if(a[j + 1] == a[i]) j++;
next[i] = j;
}
} int main()
{
while(~scanf("%s", a + 1))
{
lena = strlen(a + 1);
get_next();
int j = lena;
stack<int> s;
while(j) s.push(j), j = next[j];
while(!s.empty()) printf("%d ", s.top()), s.pop();
puts("");
}
return 0;
}

综合题

poj 2185

这道题不知道为什么一直A不了。先放着

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1e4 + 10;
const int MAXM = 75 + 10;
char s[MAXN][MAXM], t[MAXN];
int next[MAXN], f[MAXN];
int n, m, r, c, j; int get_r() //一行看作一个字符,很牛逼。
{
next[1] = 0;
for(int i = 2, j = 0; i <= n; i++)
{
if(j > 0 && strcmp(s[j + 1], s[i])) j = next[j];
if(!strcmp(s[j + 1], s[i])) j++;
next[i] = j;
}
return n - next[n];
} int get_c()
{
memset(f, 0, sizeof(f));
_for(i, 1, n)
_for(len, 1, m)
REP(j, 0, m)
{
if(s[i][j] != s[i][j % len]) break; //这个操作要学学
if(j == m - 1) f[len]++;
}
_for(i, 1, m) //用桶这个思路很妙
if(f[i] == n)
return i;
} int main()
{
scanf("%d%d", &n, &m);
_for(i, 1, n) scanf("%s", s[i]);
printf("%d\n", get_r() * get_c());
return 0;
}

KMP算法题集的更多相关文章

  1. 51nod 贪心算法题集

    2070 最小罚款: 题意:初始有n元,每个任务有2个参数:t和w,<=t时刻前完成任务才可避免造成损失w.问:如何安排才能尽可能避免损失?一个任务执行时间是一个单位时间. 分析:任务按时间排个 ...

  2. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

  3. hihoCoder #1015 : KMP算法【KMP裸题,板子】

    #1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  4. 串的模式之kmp算法实践题

    给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...

  5. hdu 1711 KMP算法模板题

    题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...

  6. 51NOD欧姆诺姆和项链——KMP算法(非水题)

    >>点击进入原题测试<< 思路:好久不见,今天要开始真正写题了.这个题之前我的理解有点问题,导致写了很久最终都是一直都只能过样例.需要注意的是输出中每一个“1”都是和别的输出相 ...

  7. 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集

    Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...

  8. 笔试算法题(52):简介 - KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm)

    议题:KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm) 分析: KMP算法用于在一个主串中找出特定的字符或者模式串.现在假设主串为长度n的数组T ...

  9. LeetCode刷题--基础知识篇--KMP算法

    KMP算法 关于字符串匹配的算法,最知名的莫过于KMP算法了,尽管我们日常搬砖几乎不可能去亲手实现一个KMP算法,但作为一种算法学习的锻炼也是很好的,所以记录一下. KMP算法是根据三位作者(D.E. ...

随机推荐

  1. Python-基础-day1

    一.python的介绍 1.python的出现与应用场景 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯 ...

  2. python初学者学习笔记

    python开发: a.Python基础 b.网络编程 c.web框架 —用于写网站 d.设计阶段+算法 e.项目阶段 开发: 开发语言:高级语言:python/Java/PHP/C#/Go/ruby ...

  3. SSM整合(spring,spirngmvc,mybatis)

    整合思路   准备环境:导入jar包(spring mybatis  dbcp连接池  mysql驱动包 log4j) 工程结构: --------------------------- 1.  整合 ...

  4. BA--无风机冷却塔

    无风机冷却塔的优点 1.无运转振动噪音传统冷却塔噪声源为冷却风扇马达运转所产生,其诱发之塔体振动,具有噪音共振加强性,为有效抑制振动之传导,须加装防震铁架及避震器.因冷却方式不同,LFC-N型无风机科 ...

  5. Spring 注解学习笔记

    声明Bean的注解: @Component : 组件,没有明确的角色 @Service : 在业务逻辑层(service层)使用 @Repository : 在数据访问层(dao层)使用. @Cont ...

  6. [Design]制作磨砂效果

    比较适合运用到网页或者APP的设计当中,推荐过来和飞特的朋友们一起分享学习了,先来看看最终的效果图吧 具体的制作步骤如下:

  7. POJ 3243

    Babystep算法.具体为什么,我也不太明白,好像资料不多. #include <iostream> #include <cstdio> #include <cstri ...

  8. 王立平--split字符串切割

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTUyNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. 页面与后台传递中文乱码问题(java乱码)

    1.前台中文传递到后台乱码. 前台不须要处理, 系统一般都会默认把中文转化为ISO-8859-1类型. 仅仅需在后台接受数据是处理 Str为前台传过来的中文字符串: String inputer = ...

  10. 经验总结21--抓取WEB数据,汇率,HtmlAgilityPack

    网上找了非常多资料,PHP的比較多,然后找到有csv文件的.处理起来非常麻烦,国外的站点速度非常慢. 最后还是去页面上抓取数据,我是从中国银行抓取的,各位可去其它站点抓取. 1.模拟请求URL. st ...