
SAM
a1s4z5
这个作者很懒,什么都没留下…
展开
-
SPOJ LCS
求两个串的最长公共字串后缀自动机模板题#include<bits/stdc++.h>using namespace std;const int maxn = 251234,mlen = 26;int toid(char c){ return c - 'a'; }struct Node{ int len,fa,nex[mlen]; Node(int _len = 0){原创 2016-09-02 14:49:32 · 378 阅读 · 0 评论 -
bzoj 4516 生成魔咒
因为SAM增量法构造的特点,所以每一次增加节点计算就可以了因为SAM的转移是线性的,所以开个map也是兹辞的#include<bits/stdc++.h>using namespace std;const int maxn = 112345;struct Node{ int len,fa; map<int,int> nex; Node(int _len = 0){原创 2016-09-02 14:50:03 · 314 阅读 · 0 评论 -
SPOJ SUBLEX
求字典序第k大字串SAM的节点和转移所构成的是一个DAG,并且SAM从起点开始的每一条路径都是模式串的一个字串,根据这两个性质在SAM上dfs即可#include<bits/stdc++.h>using namespace std;const int maxn = 91234*2 ,mlen = 26;char tem[maxn];struct Sam{ int len[maxn],fa原创 2016-09-02 14:50:50 · 301 阅读 · 0 评论 -
Hdu 5853 Jong Hyok and String
先给出n个模式串,然后有m个询问,每次询问对于一个字符串,和他rightright集相同的字符串的个数既然都rightright集了,显然是一个SAMSAM的题对多串建立SAMSAM然后将询问的字符串放在SAMSAM上runrun就好了要是转移到了nullnull说明答案是0,否则答案就是len[st]−len[fa[st]]len[st] - len[fa[st]]#include<bits/st原创 2016-09-03 10:17:31 · 505 阅读 · 0 评论 -
SPOJ NSUBSTR
给出一个长25×10425 \times 10 ^ 4 的字符串,定义f(x)f(x)为所有的长xx的子串中出现次数最多的那个的出现次数,求f(1),f(2)...f(strlen)f(1),f(2)...f(strlen)首先对输入的字符串建立SAMSAM然后对于每一个节点所对应的[min,max][min,max]这个区间,用rightright去更新这个区间的maxmax,这样最后的结果就是需原创 2016-09-06 09:42:41 · 309 阅读 · 0 评论 -
bzoj 3238 差异
给出一个长n的字符集为小写字母的字符串,求∑1≤i<j≤nlen(Suffixi)+len(Suffixj)−2×len(lcp(Suffixi,Suffixj))\sum \limits _{1 \le i < j \le n} len(Suffix_i) + len(Suffix_j) - 2 \times len(lcp(Suffix_i,Suffix_j)) SuffixxSuffix_x原创 2016-09-07 19:35:41 · 481 阅读 · 0 评论 -
Hdu 4416 Good Article Good sentence
给出一个的字符串A,|A|≤100,000A,|A| \le 100,000,nn个字符串,分别为Bi,∑i=1n|Bi|≤100,000B_i,\sum\limits_{i=1}^n|B_i| \le 100,000,求AA中没有在任何一个BiB_i中出现的字串的个数。对AA建立SAMSAM,将每一个BiB_i都放在SAMSAM上运行,记录SAMSAM中的每个节点对应的Bi中最长的匹配长度。对于S原创 2016-10-25 22:05:24 · 277 阅读 · 0 评论