KMP

简要说明

  • \(kmp\)是一个非常神奇的东西.它的\(fail(next)\)数组\(f[i]\)就表示\(1\)~\(i\)这个串的最长公共前缀后缀长度.根据这个\(fail\)数组,在匹配的时候就可以加快当前匹配位置的转移,省去一些不必要的比较.

题目

剪花布条

  • 题意:给两个字符串\(s\),\(t\),问将\(s\)按照适当的方式切割后,最多能得到几个串\(t\)?
  • 这里考虑不使用\(hash\)的做法.
  • 在字符串\(s\)中找\(t\),用\(kmp\)即可.需要注意的是前后两次的串不能相交,因为两者不能被同时取到.
  • 匹配的同时记录一下上一个匹配位置即可.\(kmp\)中,若\(j=|t|\),那么此时的\(i\)恰好为这组匹配的起点.
View code

#include"bits/stdc++.h"
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp='0'&&jp1 || s[0]!='#') )
{
int lspos=-0x7fffffff;
scanf("%s",t);
n=strlen(s);
m=strlen(t);
int ans=0;
f[0]=f[1]=0;
for(int i=1;i=lspos)
{
lspos=i;
++ans;
}
}
printf("%d\n",ans);
}
return 0;
}


Power Strings

  • 题意:求一个字符串的最短循环节长度.
  • 这里考虑不使用\(hash\)的做法.
  • 结论:最小循环节长度为\(\frac{n}{n-fail[n]}\),若其为整数.否则为\(|S|\).
  • 证明?不会.建议感性理解或移步此处.
View code

#include
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp='0'&&jp

Radio Transmission

  • 题意:求一个字符串的最短循环节长度.最后一段可以为循环节的前缀.如\(cabcabca\)的最短循环节可以被定义为\(cab\).
  • 这里考虑不使用\(hash\)的做法.
  • 结论:这种定义下的最短循环节长度为\(n-fail[n]\).
  • 感性证明:去掉这个长度为\(fail[n]\)的后缀后,前面的串已经找不到严格意义的循环节.否则可以拼接在\(fail[n]\)对应的公共前后缀上,使\(fail[n]\)增大.此时将前面所有字符作为一个循环节.去掉的部分一定是这个循环节的前缀,满足定义的要求.
View code

#include"bits/stdc++.h"
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp='0'&&jp

OKR-Periods of Words

  • 题意:定义一个串的\(proper\)前缀为它的非空且不等于自身的前缀.定义一个串\(A\)的周期为\(Q\),当且仅当\(Q\)为\(A\)的\(proper\)前缀,且\(A\)为\(QQ\)的前缀.求出一个串所有前缀的最大周期长度和.
  • 只需要沿着\(fail\)指针(失配边)往前跳,跳到第一个不为\(0\)的位置即可,
  • 可以路径压缩进行优化.
View code

#include"bits/stdc++.h"
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp='0'&&jp

似乎在梦中见过的样子

  • 题意:在一个字符串中,规定一个形如 \(A+B+A\) 的子串是特殊的,其中有\(|A|\geq k,|B|\geq 1\).给定一个字符串 \(S\) 和常数 \(k\) ,求出 \(S\) 特殊的子串数目.\(|S|\leq 1.5*10^4.\)
  • 此题的数据范围 \(n^2\) 刚好够卡过去.人,要有信仰.
  • 暂时不知道有没有更优秀的做法,但 \(n^2\) 的做法的确是相当无脑的.
  • 枚举特殊子串的左端点 \(x\) ,求出以 \(x\) 为首的后缀的 \(fail\) 数组.计算的时候注意细节,要满足当前的公共前后缀长度大于 \(k\) ,且小于这个串的一半,保证 \(|B|\geq 1\).
View code

#include"bits/stdc++.h"
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp='0'&&jp=(i-x+1))
j=f[j];
if(j-x+1>=k)
++ans;
}
}
int main()
{
scanf("%s",s+1);
k=read();
n=strlen(s+1);
for(int i=1;i

Censoring

  • 题意:给出两个字符串 \(S\) 和 \(T\),每次从前往后找到 \(S\) 中的一个 \(T\) 并将其删除,空缺位依次向前补齐,直到 \(S\) 串中不含 \(T\) 串.求最终的 \(S\) 串.
  • 用栈维护串\(S\),匹配成功时从栈顶开始删除.因为要删除多个,所以要用手写的栈.
  • 匹配的过程可以用\(kmp\)或\(hash\)进行优化.
View code

#include"bits/stdc++.h"
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp='0'&&jp

kmp学习小结的更多相关文章

  1. flex学习小结

    接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...

  2. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  3. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  4. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  5. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  6. ExtJs学习笔记之学习小结LoginDemo

    ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  7. 点滴的积累---J2SE学习小结

    点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...

  8. (转) Parameter estimation for text analysis 暨LDA学习小结

    Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...

  9. dubbo学习小结

    dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...

随机推荐

  1. word2vector 使用方法 计算语义相似度

    参考:http://techblog.youdao.com/?p=915#LinkTarget_699word2vector是一个把词转换成词向量的一个程序,能够把词映射到K维向量空间,甚至词与词之间 ...

  2. 推荐给开发者的11个PHP框架(转)

    PHP框架对于Web开发者来说是非常有用的工具,它可以帮助使用者更快.更容易的完成项目.根据调查,PHP仍是Web开发中最受欢迎和最实用的平台之一.当谈及Web开发时,很多人依然会选择使用PHP框架, ...

  3. ContentControl和ContentPresenter的应用

    1:wpf中,所有的内容控件都继承自“ContentControl” ,所以我们可以直接应用“ContentControl”自定义我们“需要的”内容控件. 2:ContentControl具有Cont ...

  4. 第三章 如何使用Burp Suite代理

    Burp Proxy 是Burp Suite以用户驱动测试流程功能的核心,通过代理模式,可以让我们拦截.查看.修改所有在客户端和服务端之间传输的数据. 本章主要讲述以下内容: Burp Proxy基本 ...

  5. bzoj1083: [SCOI2005]繁忙的都市 瓶颈生成树

    https://www.lydsy.com/JudgeOnline/problem.php?id=1083 题意:给你一个图,求生成树最大边权最小值 就是求瓶颈生成树(生成树中最大边权最小),最小生成 ...

  6. HDU 3397 线段树区间修改

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. IOS-源代码管理工具(Git)

    一.简介 什么是git? git是一款开源的分布式版本控制工具 在世界上所有的分布式版本控制工具中,git是最快.最简单.最流行的   git的起源 作者是Linux之父:Linus Benedict ...

  8. java中容器的学习与理解

    以前一直对于java中容器的概念不理解,虽然学习过,但始终没有认真理解过,这几天老师提出了这样一个问题,你怎么理解java中的容器.瞬间就蒙了.于是各种搜资料学习了一下,下面是我学习后整理出来的的一些 ...

  9. MYSQL-实现ORACLE 和SQLserver数据中- row_number() over(partition by ) 分组排序功能

    网上看见了好多例子都基本上是一样的,没有过多的解释,对于一个初学MySQL来说有点难,我把部分转摘过来如下 原文:http://www.cnblogs.com/buro79xxd/archive/20 ...

  10. Mysql 表锁定的问题

    下面的几个语句查询到,但如何定位到对应的进程,还需要学习这些表的结构. select * from information_schema.innodb_trx ## 当前运行的所有事务select * ...