kmp学习小结
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学习小结的更多相关文章
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- (转) Parameter estimation for text analysis 暨LDA学习小结
Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...
- dubbo学习小结
dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...
随机推荐
- python 匹配中文和英文
在处理文本时经常会匹配中文名或者英文word,python中可以在utf-8编码下方便的进行处理. 中文unicode编码范围[\u4e00-\u9fa5] 英文字符编码范围[a-zA-Z] 此时匹配 ...
- 单元测试 使用 Effort 内存数据库 报错
单元测试中 使用 Effort 内存数据库,可能会遇到两个错误: 1. :“No Entity Framework provider found for the ADO.NET provider wi ...
- P3600 随机数生成器
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- kubernetes源码分析 -- kube-proxy
Kube-proxy需要在每一个minion结点上运行.他的作用是service的代理,负责将业务连接到service后面具体执行结点(endpoints). 我们列一下体现kube-proxy ...
- Java Applet基础
applet是一种Java程序.它一般运行在支持Java的Web浏览器内.因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序. 如下所示是独立的Java应用程序和app ...
- poj1113凸包
就是求凸包的周长加以l为半径的圆周长,证明略 由于之前写过叉积,所以graham扫描算法不是很难理解 #include<map> #include<set> #include& ...
- Python list降序排序
test = [6,1,2,3,4,5] a = sorted(test,reverse=True) print a 结果如下: [6, 5, 4, 3, 2, 1] 你可以参考下sorted,里面是 ...
- linux下鼠标穿透和取消穿透--linux小白,大神无视
最近在用qt写一个跨平台的软件,因为设置了无边框,并且我自己给程序窗口加了阴影,阴影范围又比较大 所以必须给阴影区域加上鼠标穿透才能有更好的体验. 上网查了一下,在windows下使用SetWindo ...
- Dubbo + Zookeeper 简单配置
Dubbo + Zookeeper Zookeeper 下载及配置 下载到本机/usr/local目录 wget https://mirrors.tuna.tsinghua.edu.cn/apache ...
- IOS-第三方开源库
我找的琐碎框架 1.HZExtend:应用快速开发架构集合了MVC和MVVM的特点https://github.com/GeniusBrother/HZExtend : 1.减少控制器压力以及耦合 2 ...