字符串算法
雪夜飞花
这个作者很懒,什么都没留下…
展开
-
最长公共子串(后缀数组+LCP)
求两个串的最长公共子串,我们可以将两个串中间插入一个两个串都没有的字符串起来,然后计算出他的后缀数组(sa)和高度数组(lcp),不在同一串中的sa中相邻后缀的最长公共前缀(即高度数组的最大值)就是两个串的最长公共子串。#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int max原创 2017-08-19 18:50:39 · 838 阅读 · 0 评论 -
最长回文子串(Manancher算法)
计算回文子串的方法有很多,比如将该串反转后拼接在一起利用后缀数组,这里用一个O(n)的算法 首先这个算法为了将奇数串和偶数串放一起考虑,在每个字符的之间都加入了一个该字符串不存在的字符,如: aabbaa #a#a##b#b#a#a# 这样,所有的串都变成了奇数的形式 我们定义如下变量: p[maxn]:存储以i位置为中心的最长回文半径 id:表示当前最长回文串的中心位置 mx:原创 2017-08-19 16:47:05 · 846 阅读 · 0 评论 -
高度数组(后缀数组伴侣lcp)
利用后缀数组和尺取法求得相邻两个后缀数组之间的最长公共前缀,计入lcp数组,求整个串从i到j的最长公共前缀就是一个标准的RMQ问题。int rank[maxn];void lcp(char*s, int *sa, int *lcp) { int n = strlen(s); for (int i = 0; i <= n; i++) rank[sa[i]] = i; int原创 2017-08-18 18:30:44 · 474 阅读 · 0 评论 -
后缀数组(倍增法+基数排序思想)
我们只要记录字符串每个后缀的起始位置,就可以表示字符串的每一个后缀。将这种表示按照后缀的字典序排序,就得到了后缀数组。下面用倍增法求后缀数组,每次计算从i开始,长度为k的字符串的字典序rank(i,k)利用基数排序的思想,我们已经计算好了rank(i,k),然后我们在rank(i,k)的基础上,rank(i+k,2k)进行排序,得到的排序结果就是rank(i,2k)的结果。下面代码给出了O(n*lo原创 2017-08-18 13:19:12 · 790 阅读 · 1 评论 -
AC自动机(trie+KMP)
AC自动机可以在线性时间内匹配多个模式串,算法思路是一个在trie上使用KMP算法 trie的讲解和AC自动机算法具体讲解(dalao的帖子) http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html//hdu2222#define clr(a,x) memset(a,x,sizeof a)struct Aho {原创 2017-08-17 18:16:08 · 452 阅读 · 0 评论 -
KMP算法
KMP算法是一种字符串模式匹配算法,旨在通过子串来发现不匹配的情况下,下一次模式串应该移动的距离,来减少回溯。 因为这个距离是模式串所决定的,与匹配串无关,所以我们对模式串做一个预处理,可以得到一个next数组如下 -1 j=0 max{k|i原创 2017-08-12 21:57:16 · 145 阅读 · 0 评论