
后缀自动机
文章平均质量分 79
我不会额
这个作者很懒,什么都没留下…
展开
-
SPOJ - NSUBSTR Substrings
题目:f[i]表示字符串str中长度为i的子串出现的最大次数,给你一个字符串,输出所有的f[i] 思路:对字符串str建立SAM,添加sc表示当前节点的出现次数,然后跑一遍字符串,把经过的节点的sc赋值1,然后每一个节点x都会影响到link[x],即sc[link[x]]+=sc[x],要按照拓扑序来更新。 dp[i]表示长度为i的子串出现的最大次数 代码: #pragma comment原创 2017-09-15 15:48:35 · 261 阅读 · 0 评论 -
SPOJ - SUBLEX Lexicographical Substring Search 求字典序第k小的子串
题目:求字符串字典序第k小的子串 思路:统计每个状态的子串的个数,按字典序寻找 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #include #include #include #includ原创 2017-09-15 22:07:28 · 2892 阅读 · 0 评论 -
HDU - 4416 Good Article Good sentence
题目:给一个字符串S和一系列字符串T1~Tn,问在S中有多少个不同子串满足它不是T1~Tn中任意一个字符串的子串。 思路:match[i]表示当前节点能匹配的最长长度 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include原创 2017-09-17 23:08:16 · 344 阅读 · 0 评论 -
SPOJ - LCS Longest Common Substring 求2个字符串的最长公共子串
题目:求2个字符串的最长公共子串的长度 思路:对str1建立后缀自动机,然后让str2去跑 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #include #include #include #原创 2017-09-14 22:50:36 · 384 阅读 · 0 评论 -
SPOJ - LCS2 Longest Common Substring II 多个串的最长公共子串
题目:求多个串的最长公共子串 思路:对第一个串建立SAM,其余的串在上面跑,与求2个串的最长公共子串不同的是,当跑到p时,还要更新link[p] 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #原创 2017-09-15 10:44:03 · 360 阅读 · 0 评论 -
POJ - 3415 Common Substrings 求2个串大于K的公共子串个数
题目:求2个串大于K的公共子串个数 思路:对第一个串建立SAM,通过拓扑序,算出每个节点在串中的出现次数,然后用第二个串去跑SAM,match[i]表示i节点的经过次数 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #includ原创 2017-09-18 10:14:39 · 505 阅读 · 0 评论 -
HDU - 4436 str2int
题目:给你n个由0~9组成的字符串,求不同的子串表示的十进制数的和,对2012取模 思路:将这n个串用10连接起来,建立一个SAM,然后跑拓扑序,注意含有前导0的数不要计算否则会重复计算 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #includ原创 2017-09-18 14:17:45 · 483 阅读 · 0 评论 -
HDU - 3518 Boring counting
题目:给定一个字符串str,求str中至少出现2次且不覆盖的子串的个数 思路:每插入一个字符str[i],就把str+i+1在当前的SAM中跑一遍,算出每个接待最大匹配长度 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #incl原创 2017-09-18 15:19:56 · 469 阅读 · 0 评论 -
HDU - 4622 Reincarnation
题目:给定一个字符串,求字符串区间[l,r]中的不同子串的个数 1 思路:先预处理出来,每当加入一个字符时,新增的子串为len[cur]-len[link[cur]] 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #inc原创 2017-09-18 15:52:42 · 646 阅读 · 0 评论