![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
字符串
acmer_zp
这个作者很懒,什么都没留下…
展开
-
后缀数组
#include//sa为后缀数组,把后缀从小到大排序把后缀开头存起来,rank为名次数组,以i开头的后缀在所有后缀中排第几#include#include#include#include#define F(x) ((x)/3+((x)%3==1?0:tb))#define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2)using namespace std;原创 2016-10-27 16:21:56 · 259 阅读 · 0 评论 -
Manacher算法--O(n)回文子串算法
马拉车算法详解地址#include<cstring>#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int p[2000010];//记录以s[i]为中心的回文串最大可向右延伸几位,p[i]-1为原串以i为中心的最长回文串长度int Find(string s){ int mx=0原创 2017-07-04 15:31:41 · 319 阅读 · 0 评论 -
扩展KMP
详解链接 hdu4300题解链接#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=1e6+10;int Next[maxn],extend[maxn];void get_next(char a[]){ int len原创 2017-07-04 20:24:29 · 286 阅读 · 0 评论 -
字符串hash
大佬博客 题目链接 题意:刚开始给定n个字符串,每一个字符串有一个权值,后面有q次询问,1代表将a字符串的权值改为吧,2为询问有多少个字符串的后缀包含a并且权值是小于等于a字符串的权值的。 思路:上面大佬的博客里面讲了字符串的hash,这道题预处理处每一个字符串的hash值,然后n^2统计出任意两个字符串之间的后缀关系,最后用nq的复杂度查找就好了。#include<cstdio>#incl原创 2017-07-24 18:37:16 · 331 阅读 · 0 评论 -
hdu 2243 AC自动机+dp(矩阵快速幂优化)
做这个之前建议做一下poj 2778 这道题要求长度小于等于m的字符串包含所给串的有多少种,可以算出所有的情况然后减去不包含所给串的情况就是所求的。 大佬博客 大佬博客 矩阵里面存的是从i节点到j节点走一步共有多少种走法(不能走题目上给的字符串)。 然后将这个矩阵m次幂就可以求出走m步(长度为m的字符串)有多少种不包含做给串的字符串。小于等于m将其各个次幂加起来就好了,可以改一改矩阵一次就原创 2017-07-07 17:38:47 · 341 阅读 · 0 评论 -
字符串的最大最小表示法
算法描述:给定一个字符串s,可以进行左循环(右循环)移位,总共的结果有strlen(s)种,在这些结果中最小的是那个,最大的是哪个。 详解描述 论文传送门 HDU3374 题目意思:给定一个字符串s求循环几次会是字典序最小的(最小表示),最大的(最大表示),分别会出现几次。 思路:第一个用上面提到算法就可以算,后面的只需要求出以为后的有几个循环就就好了。#include<cstdio>#原创 2017-07-05 11:50:41 · 447 阅读 · 0 评论 -
kmp
/*kmp的next数组存的是i之前的串的前缀和后缀的最长匹配长度*/#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int next1[10100];int bmBc[10100],suff[10100],bmGs[10100];string st原创 2017-07-04 10:15:03 · 284 阅读 · 0 评论 -
后缀数组(关于只出现一次的最短公共子串)
Codeforces 427 D. Match & Catch 题意:求两个字符串最短的公共子串,并且在两个串中是唯一出现的(只出现过一次); 题解 个人感觉讲的很好转载 2017-02-26 15:04:55 · 549 阅读 · 0 评论 -
后缀数组(不小于k个字符串中的最长子串)
POJ 3294 Life Forms 题意:输入n个DNA序列,你的任务是求出一个长度最大的字符串,使得它在超过一般的DNA序列中出现。如果有多解,按照字典序从小到大输入所有解,无解输出?。 思路:把所有的都连接起来,用不同的字符隔开,求其后缀数组和height数组,然后二分长度,按照长度分组,判断是否有一组有超过一半的字符串,最后根据长度输出答案;/*** 倍增算法(n*logn)*原创 2017-02-20 18:43:25 · 610 阅读 · 0 评论 -
后缀数组(长度不小于k的公共子串的个数)
POJ 3415 Common Substrings 题意:长度不小于k的公共子串的个数; 思路:基本思路是计算A的所有后缀和B的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k的部分全部加起来。 先将两个字符串连起来, 中间用一个没有出现过的字符隔开。按height值分组后,接下来的工作便是快速的统计每组中后缀之间的最长公共前缀之和。 扫描一遍, 每遇到一个B的后缀就统计与前面的A原创 2017-01-18 18:10:12 · 272 阅读 · 0 评论 -
后缀数组( 连续重复子串)
POJ 2406 Power Strings 题意:给定一个字符串L,已知这个字符串是由某个字符串S重复R次而得到的,求R的最大值。 思路:先求出后缀数组,Rank数组,height数组,然后求出以每个字符开头的后缀,与原串的最长公共子串,如果长度等于以某个字符开头的后缀长度则总长度减去这个后缀长度就是重复的最短串的长度,用总长度除去就是最多重复的次数; 要用dc3,da会超时的;/***原创 2017-01-18 16:09:02 · 489 阅读 · 0 评论 -
后缀数组(重复次数最多的连续重复子串)
POJ3693:Maximum repetition substring题意:给定一个字符串,求重复次数最多的连续重复子串。思路:先穷举长度L,然后求长度为L的子串最多能连续出现几次。首先连续出现1次是肯定可以的,所以这里只考虑至少2次的情况。假设在原字符串中连续出现2次,记这个子字符串为S,那么S肯定包括了字符r[0], r[L], r[L*2],r[L*3], ……中的某相邻的两个。所以只须看字原创 2017-01-17 16:42:09 · 553 阅读 · 0 评论 -
后缀数组(可重叠的k次最长重复子串)
POJ3261:Milk Patterns 题意:给定一个字符串,求至少出现k次的最长重复子串,这k个子串可以重叠; 思路:这题的做法和上一题差不多,也是先二分答案,然后将后缀分成若干组。 不同的是,这里要判断的是有没有一个组的后缀个数不小于k。如果有,那么存在k个相同的子串满足条件,否则不存在。这个做法的时间复杂度为O(nlogn)。/*** 倍增算法(n*logn)* 待排序数组长度为原创 2017-01-17 09:50:33 · 509 阅读 · 0 评论 -
后缀数组(不可重叠最长重复子串)
poj 1743 二分答案,把题目变成判定性问题:判断是否 存在两个长度为k的子串是相同的,且不重叠。解决这个问题的关键还是利用 height数组。把排序后的后缀分成若干组,其中每组的后缀之间的height值都 不小于k。 有希望成为最长公共前缀不小于k的两个后缀一定在同一组。然 后对于每组后缀,只须判断每个后缀的sa值的最大值和最小值之差是否不小于 k。如果有一组满足,则说明存在,否原创 2016-12-14 21:29:23 · 524 阅读 · 0 评论 -
AC自动机
#include#include#include#include#includeusing namespace std;struct node{ int Next[500010][26];//数组存图 int fail[500010];//fail指针 int End[500010];//每个模式串出现的次数 int root,L;//根节点标号为0原创 2016-10-18 18:26:22 · 352 阅读 · 0 评论 -
字典树
#include#include#include#includeusing namespace std;const int N=2*1e5+10;int n,m,q,k,j;struct Dictree//字典树{ int cont;//单词出现次数 struct Dictree *tree[26];//26个子节点}*a;//a为头结点是空的void ini原创 2016-10-18 19:52:43 · 236 阅读 · 0 评论 -
后缀自动机
clj大佬论文 自己对于后缀自动机的理解:每一个节点代表的是具有相同的right集合的子串(right集合的定义具体去看clj大佬的论文),整个最后构成的有向无环图,可以看成是一棵树,step[i]代表的是right[i]中子串的最长长度也就是论文中所说的Max(i),pre[i]代表的是i节点在树中的父节点,这里和AC自动机里的fail指针有点类似,往上找就相当于找到的是当前串的后缀在SAM中出原创 2017-09-21 17:51:55 · 357 阅读 · 0 评论