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. helloworld:一个完整的WCF案例

    服务端 1.创建一个空的解决方案:WCFDemo: 2.创建一个宿主控制台程序:Host 3.右击Host项目,选择“添加”--“新建项”,选择“WCF服务”创建名为“Service1.cs”的服务 ...

  2. ubuntu如何U盘启 动制作

    先到出 U盘的位置, 方法有很多,terminal 用root权限,采用fdisk -f 命令 unmount /dev/sdb -I //U盘拨出 sdb为U盘挂载的位置 mkfs.fat /dev ...

  3. tp5搭建1

    1.首先在wamp环境根目录下创建文件夹resource. 2.利用composer下载tp5框架 怎么利用composer下载tp5框架 根据tp5完全开发手册,composer下载你的tp5框架 ...

  4. jquery tmpl模板

    之前用模板渲染都是用angular,无意间发现了jquery tmpl这种轻量级,其文档在这里 官方解释对该插件的说明:将匹配的第一个元素作为模板,render指定的数据,签名如下: .tmpl([d ...

  5. php redis 秒杀demo

    $redis = new Redis(); $redis->connect("127.0.0.1", "6379"); $redis->select ...

  6. python ssh登录

    3. 编写linkssh.py #!/usr/bin/env python# -*- coding: utf-8 -*-# filename: pexpect_test.py'''Created on ...

  7. Android Codenames, Tags, and Build Numbers

    Starting with Cupcake, individual builds are identified with a short build code, e.g. FRF85B. The fi ...

  8. nyi63——树

    #include<bits/stdc++.h> using namespace std; int cnt; struct node { int data; int flag; node * ...

  9. qt5.2.1在linux下去除最大化和最小化按钮

    #include <QtGui/QGuiApplication> #include <QDebug> #include <QScreen> #include &qu ...

  10. Highcharts 丢失值区域图;Highcharts 反转x轴与y轴;Highcharts 曲线区域图;Highcharts 区间区域图;Highcharts 使用区间和线的区域图

    Highcharts 丢失值区域图 chart 配置 将 chart 的 spacingBottom 属性设置为 30.表示图表间的间隔区间. var chart = { type: 'area', ...