字符串
ACdreamers
这个作者很懒,什么都没留下…
展开
-
NEFU704(AC自动机+状态压缩)
题目:Password Leakage#include #include #include #include using namespace std;char S[1000010];char keyword[51];char str[51];char T[51];class Trie{ public: int count; Trie *f原创 2013-08-04 19:43:00 · 1137 阅读 · 0 评论 -
SPOJ1811最长公共子串问题(后缀自动机)
题目:http://www.spoj.com/problems/LCS/ 题意:给两个串A和B,求这两个串的最长公共子串。 分析:其实本题用后缀数组的DC3已经能很好的解决,这里我们来说说利用后缀自动机如何实现。对于串A和B,我们先构造出串A的后缀自动机,那么然后用B串去匹配,对于B,我们一位一位地扫描,维护一个ans值,表示从B串的开始到B[i]的这个子串与A的最长公共子原创 2013-08-31 16:54:49 · 3825 阅读 · 0 评论 -
SPOJ1812(后缀自动机求n个串的最长公共子串)
题目:http://www.spoj.com/problems/LCS2/ 题意:给定n个串,求它们的最长公共子串。 思路就是:先将一个串建SAM,然后用后面的串去匹配,对于每一个串,保存最大值,对于不同的串,更新最小值。SAM结点多两个值,ml表示多个串的最小值,nl表示当前串匹配的最大值。 #include #include #include #incl原创 2013-08-31 20:09:37 · 3111 阅读 · 1 评论 -
HDU4416(后缀自动机)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4416 题目大意:给一个字符串S和一系列字符串T1~Tn,问在S中有多少个不同子串满足它不是T1~Tn中任意一个字符串的子串。#include #include #include #include using namespace std;typedef long long原创 2013-08-31 21:14:37 · 3038 阅读 · 0 评论 -
HDU4622(后缀自动机)
题目:Reincarnation题意:给定一个字符串,然后再给定Q个询问,每个询问是一个区间[l,r],问在这个字符串区间中有多少个不同的子串。后缀自动机模版题:#include #include #include #include #include using namespace std;const int N=5010;struct Sta原创 2013-08-09 11:34:07 · 3164 阅读 · 2 评论 -
SPOJ7258(后缀自动机--第k大的子串)
题目:http://www.spoj.com/problems/SUBLEX/ 题意:给一个字符串,然后给Q个询问,每个询问输入一个数K,输出子串中字典序为K的字符串。#include #include #include #include using namespace std;const int N=250005;struct State{原创 2013-09-01 16:26:25 · 3256 阅读 · 0 评论 -
SPOJ8222(后缀自动机--出现次数最多的子串)
题目:http://www.spoj.com/problems/NSUBSTR/ 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值。求F(1)..F(Length(S)) #include #include #include #include using namespace std;const int N=250005;原创 2013-09-01 14:49:11 · 3680 阅读 · 0 评论 -
BZOJ2806(后缀自动机+DP)
题目:http://61.187.179.132/JudgeOnline/problem.php?id=2806 题意:给定一个由M个01串组成的字典。依据这个字典和一个阀值L,可以断言一个01串是否"熟悉",其定义是:把一个串划分成若干段,如果某个段的长度不小于L,且是字典中的某个串的连续子串,则这个段可识别;如果对于给出的串,存在一个划分,使得可识别的长度不小于总长度的90%,原创 2013-09-01 18:06:57 · 3604 阅读 · 3 评论 -
扩展KMP算法
扩展KMP:给出模板串S和子串T,长度分别为Slen和Tlen,要求在线性时间内,对于每个S[i](0度,记为extend[i](或者说,extend[i]为满足S[i..i+z-1]==T[0..z-1]的最大的z值)。扩展KMP可以用来解决很多字符串问题,如求一个字符串的最长回文子串和最长重复子串。#include #include #define N 10005int原创 2012-12-18 13:09:16 · 10220 阅读 · 2 评论 -
AC自动机
AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。AC自动机详细原理戳这里 1、理解构造失败指针 构造失败指针的过程概括起来就一句话:设这个节点上的字母为C,沿着他父亲的失败指针走,直到走到一个 节点,他的儿子中也有字母为C的节点。然后把当前节点的失败指针指向那个字母也为C的儿子。如果一直走到 了root都没找到,那就把失败原创 2012-12-02 20:07:56 · 1549 阅读 · 0 评论 -
字典树原理
Trie树就是字典树,又称单词查找树,是一种树形结构,是一种哈希树的变种。其核心思想就是空间换取时间。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 举个简单的例子。给你100000个长度不超过10的单词。对于每一个单原创 2012-10-19 12:34:24 · 1938 阅读 · 0 评论 -
Manacher算法
题目:最长回文 本来这道题可以用扩展KMP或者后缀数组来做,但是我感觉没有必要用青龙偃月刀来削苹果,下面就来介绍Manacher算法:Manacher算法专门用来求某个字符串的最长回文子串,时间复杂度为O(n). 首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足: s[i-rad[i],i-1]=s[i+1,i+rad[i]]很明显原创 2013-01-22 19:59:33 · 2530 阅读 · 0 评论 -
KMP字符串匹配
判断串b是否是串a的的字串:1.字符串匹配的朴素算法代码: #include #include int Match(char *S,char *T){ int Slen=strlen(S); int Tlen=strlen(T); int i=0,j=0; while(i<Slen&&j<Tlen) {原创 2012-06-07 20:32:05 · 1682 阅读 · 1 评论 -
字符串Hash的原理与应用
下面的字符串Hash函数,最常用的是BKDRHash和ELFHash。unsigned int SDBMHash(char *str){ unsigned int hash = 0; while (*str) { hash = (*str++) + (hash << 6) + (hash << 16) - hash; }原创 2013-09-18 21:12:56 · 9200 阅读 · 0 评论 -
HDU2896(病毒侵袭--AC自动机)
题目:病毒侵袭#include #include #include #include #include using namespace std;const int N=1000050;char S[N];char keyword[256];class Trie{ public: int index; Trie *fai原创 2013-08-02 14:30:09 · 1967 阅读 · 0 评论 -
HDU4099(斐波那契数列与字典树)
题目:Revenge of Fibonacci 题意:给出斐波那契数列的前k位,k不超过40,找出最小的正整数n,满足F(n)的前k位与给定数的前k位相同,斐波那契数列的项数不超过100000。 解析:本题可以分为两步:第一步就是预处理出100000项斐波那契数列的前40位,插入到字典树中。第二步就是查询匹配求最小的n。对于第一步,我们可以把斐波那契数列精确到50多位,原创 2013-07-20 13:08:11 · 3222 阅读 · 0 评论 -
后缀数组--(可重叠最长重复子串问题)
问题描述:给定一个字符串,求最长重复子串,这两个子串可以重叠。 其实问题可以转化为height数组的最大值。至于为什么是这样,我可以这样解释:求可重叠最长重复子串等价于求两个后缀的最长公共前缀的最大值,而形成最长公共前缀的子串一定是排名相邻的,所以问题解决。原创 2013-06-18 14:34:34 · 1744 阅读 · 0 评论 -
后缀数组--可重叠的K次最长重复子串(POJ3261)
题目:Milk Patterns #include #include #define N 1000010int wa[N],wb[N],wv[N],ws[N];int rank[N],height[N];int sa[N],r[N];int abs(int x){ return x<0? -x:x;}int cmp(int *r,i原创 2013-06-18 15:37:40 · 1803 阅读 · 0 评论 -
HDU1403(后缀数组--最长公共子串)
题目:Longest Common Substring 看代码注释请戳这里题意:判断给定的两个串中,最长的公共串。思路:将它们合并为一个串,然后利用后缀数组求解。首先是二倍增算法:时间复杂度为O(n*log(n))#include #include #define max 1000010int wa[max],wb[max],wv[max],ws[max];原创 2013-02-16 22:45:07 · 3169 阅读 · 3 评论 -
后缀数组--(最长公共前缀)
问题描述:给一个字符串,询问某两个后缀的最长公共前缀。 解析:当然用后缀数组最方便,在后缀数组中有很多重要的定义和性质,现在我们来认识一些:定义:LCP(i,j)=suffix(SA[i])与suffix[SA[j]]的最长公共前缀长度,即排号序后的后缀中第i名和第j名的最长公共前缀长度。然后我们再用一个重要的性质就可以求出LCP(i,j)了,性质描述:LCP(i,j)=min{L原创 2013-06-18 14:13:34 · 5776 阅读 · 1 评论 -
poj1743(后缀数组+二分--不可重叠最长重复子串)
题目:Musical Theme #include #include #define N 1000010int wa[N],wb[N],wv[N],ws[N];int rank[N],height[N];i原创 2013-06-17 00:13:05 · 1745 阅读 · 0 评论 -
Hash冲突处理终极版
对于Hash,我们是怎样来处理冲突的。现在就来介绍一些经典的Hash冲突处理的方法。主要包括 (1)开放地址法 (2)拉链法 (3)再哈希法 (4)建立公共溢出区原创 2014-09-01 21:18:42 · 7097 阅读 · 1 评论