博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 1200E Compress Words
阅读量:5312 次
发布时间:2019-06-14

本文共 1351 字,大约阅读时间需要 4 分钟。

\(C_n^m\)的typora,点了一下启用源代码模式就把我已经写好的博客弄没了,就给我留个标题,自动保存也只给我保存了个标题……\(C_n^m\),wdnmd

  • Time limit

    1000 ms

  • Memory limit

    262144 kB

解题思路

KMP

打比赛的时候愣是想不到怎么用KMP,总想着如果用kmp,那么每次合并都要更新nxt数组,会被卡到n方,就是想不到老字符串不用每次都全体参与KMP,每次只需要把老字符串后面那段拿出来判断就行了……还想着是不是要用啥我现在还不会的高级玩意……对KMP的理解只停留在做最裸的那种板题……

KMP有两种玩法,目的都是在合并老字符串(之前合并的结果)和新字符串(最新读入的)的时候找出可以被合并的长度,然后就能把新字符串后面那截不能合并的接到老字符串后面。边写边骂typora。由于合并的时候,老字符串和新字符串重复的长度小于等于新字符串的长度,所以处理的时候都截取老字符串后面和新字符串等长的一截(如果新字符串比老字符串长,那么就选整个老字符串)

一种是的思路——先把新字符串放前面,把“老字符串的后面一截”放后面,然后对于这个新接的合体字符串跑一遍KMP,求出nxt数组,以便找到最长的border(这个是nxt数组的定义了),这个就是可以合并的长度了,当然这个值要是大于了读入的新字符串或者之前合并出来的老字符串的长度,就要取“最长border长度、读入的新字符串的长度、之前合并的老字符串的长度”这三者的最小值,因为合并两个字符串最多就是一个把另一个吞并了,长度不会小于两个字符串中的任意一个。

另一种思路来自——每次读入新字符串以后,把新字符串作为模式串,把老字符串的后面那截作为文本串。然后就跑几乎是裸的KMP了——先求出新字符串的nxt数组,然后用新字符串去匹配文本串(老字符串的后面那截),如果匹配的时候文本串的指针跑到头了,那么现在这个模式串指针指向的字符就是合并后新字符串贡献的第一个字符。如果文本串指针还没跑到头,模式串指针跑到头了,那么说明新字符串合并上去以后就啥都不剩了,完全被老字符串吞并了。这两种情况,都可以返回模式串指针的位置。这个位置一直到新字符串末尾这段就是要新加的了。

另外,KMP各种写法导致的指针加一减一的问题,微调一下就好了。

哈希

快速求几个子串的哈希值的方法,貌似NOI2016、2017连着考了两年,其他时候也用得不少,但我至今还没填坑……再次留坑。扔个先跑了。

源代码

#include
#include
#include
const int MAXN=1e6+5;int n;char a[MAXN],b[MAXN];int nxt[MAXN];int lena,lenb;int kmp(int st)//传入模式串的匹配起点{ int i,j; nxt[0]=-1; for(i=1,j=-1;i

这场CF的F题听说是什么基环树,太难了(借口),留坑,不补了

转载于:https://www.cnblogs.com/wawcac-blog/p/11357431.html

你可能感兴趣的文章
jQuery总结或者锋利的jQuery笔记二
查看>>
前后端协作--服务器渲染与前后端分离
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
GDB调试
查看>>
centos系统python2.7更新到3.5
查看>>
一个通用的单元测试框架的思考和设计09-实现篇-视图操作
查看>>
30:Path Sum
查看>>
43: Construct Binary Tree from Preorder and Inorder Traversal
查看>>
CentOS6 下MySQL option file
查看>>
最优矩阵连乘
查看>>
通过淘宝接口免费获取IP地址信息
查看>>
Java面向对象概述及三大特征(封装,继承和多态)
查看>>
tcp下载器
查看>>
springcloud微服务总结六
查看>>
实验三 结对项目 加密与解密程序
查看>>
通过几个Hello World感受.NET Core全新的开发体验
查看>>
.NET Core跨平台的奥秘[中篇]:复用之殇
查看>>
<排序算法> 简单选择排序SelectSort
查看>>
es6在网页中模块引入的方法
查看>>