bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解
先说一下对后缀自动机的理解,主要是对构造过程的理解。
构造中,我们已经得到了前L个字符的后缀自动机,现在我们要得到L+1个字符的后缀自动机,什么需要改变呢?
首先,子串$[0,L+1)$对应的状态不存在,应当建立一个状态来表示这个串,显然,这个状态(np)的right集合是{L+1},max=L+1。
现在新建立了一个状态,我们还有两件事要干:找出能转移到这个状态的状态,建立链接;确定这个状态的min,即找到它在parent树上的父亲。
能转移到np的状态显然都是right集合包含L的状态,即p(子串$[0,L)$所在的状态)及p的祖先。
设c = s[L+1]我们沿着p往上爬,会遇到一些没有c的转移的状态,显然此时直接将c的转移连向它即可。
如果全都没有c的转移,那么np的父亲设为root,也就是说找到了np的min,为1。
否则,现在我们到了第一个含有c的转移的状态,此时p代表红色部分的状态。
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAS0AAABTCAIAAABF3sa8AAACKElEQVR4nO3ZwXHaQBiGYRWSUyZVqAbXoXpUgzvIhWbUgC+pAR8Sz4BQxGJA34p9ntmLzYhZ/+vXINMdgbQuvQFAh1ABHUKeDiFPh5CnQ8jTIeTpEPJ0CHk6hDwdQp4OIa+uDn/+fnuxlZ4o+1BRh/FmpEiKDnVIng51SF5FHR5fMcX0RNmHujqENukQ8nQIeTqEPB1Cng4hT4eQp0PI0yHk6ZBX031Jb+QGe9orXNWdS2+n1G42CiV0CHk6hDwdQp4OIa/1Drv3D2u2HjVbyjXdYfw3vtr1kPFSToeWDvN0aOkwr+kOj1IUYR1a7xBqoEPI0yHk6RDydAh5z+hwGvuu68fpIU+2TIe8lMUOp7E/++5wWLr0MFw88O/Cfhx7HUKxtdfDhdBKH9Zh3Q7DyV/ZYf2c2YAOmzON/elbnMPw33c8bObmDufvWf+aV6fDej37bPiG8g4vqvR6uE86rJAOmzONfdeP86+VGaXDFp3fXIgwb7HD5XvAkrv50//DlV7zrW0/40khZe31sGK72SiU0CHk6RDydHivPz9+7WWlR5URH3vJoejwLvFTlOK6+MALD0WHd4kfoQ7XxQeuwy3Ej1CH6+IDb7rD+YeYzxQ/xfK15VjqER97PYeyaYdb/mCwLzqEPB1C3nYdShEWPTbC6x0CG9Ah5OkQ8nQIeTqEPB1Cng4hT4eQp0PI0yHk6RDydAh5OoQ8HUKeDiFPh5CnQ8jTIeR9Avf5mrBbPz3HAAAAAElFTkSuQmCC" alt="" />
如上图,至少存在两个红色的部分,他们是相同的,且其中一个位置为L,另一个位置的下一个字符是c,(注意,红色线段以及蓝色线段的右端代表它的位置,左端代表位置减去max的地方)。设q=p->to[c],此时我们已经可以确定np的min了,就是p->max+2,即np的父亲的max应该为p->max+1。
这样,如果是图中的绿色状态,即q->max == p->max+1我们就可以宣布,找到了p的父亲。然后令p->par = q,这样在q以及所有的祖先的right集合中插入了L+1这个位置。
如果是蓝色状态,我们不得不考虑创建一个新的节点nq使它的max为p->max+1,来作为np的父亲,所以我们令nq->max = p->max + 1, np->par = nq,这样之前提到的两个问题已经全部解决了,但是事实上我们需要在p->to[c]这个状态的right集合中插入L+1,所以我们令nq->par = q->par, q->par = nq,则nq这个状态表示right集合正是现在的p->to[c]需要的,接下来我们把p以及所有p的祖先中到q的转移全部换成nq,这也要求nq和q具有相同的转移,需要memcpy(nq->to, q->to, sizeof(nq->to));
然后再谈一下广义后缀自动机,它可以同时接受若干个串,不妨考虑一棵trie,因为所有的串都可以插在trie上。特别地,这棵trie中的节点还可能拥有相同的儿子,这样可以方便我们在线插入。
与单个字符串的后缀自动机略有区别的是,此时的right集合实际上是trie上的节点,而不是一个长度L,我们考虑按照dfs序建成了如下trie树的后缀自动机,五角星部分是正在加入的。跟之前一样,只有p以及p的祖先是我们需要考虑的。
aaarticlea/png;base64,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" alt="" />
这个位置要插入的串是红色部分以及它所有的后缀,跟单个串的后缀自动机不同的是,此时p可能已经有了c的转移。按照之前说的,我们有两个事情,一个是创建一个新的状态来表示红色部分的字符串,这个状态的max应该是p->max+1,并且right集合应包含五角星所在的这个节点,第二个就是找到这个新的状态的min也就是它在parent树上的父亲。不同的是,之前我们一定会新建一个节点,因为p能转移到的状态的max是不可能达到p->max+1的,但是现在有可能已经存在这样的状态,我们可以直接在这个状态的right集合中插入五角星所在的节点,并且它的父亲之前已经找好了,我们可以直接结束。如果图中的只有绿色部分和蓝色部分与红色部分相同,且他们上面的字符有一个不同,就意味着这种状态存在。
如果只有蓝色部分跟红色部分相同,那么蓝色状态的max不会是p->max+1,肯定是 > p->max + 1的,此时需要新建一个节点,而我们已经找到了这个新节点的父亲,就是p->to[c]。
这样就对应一段新的代码:
if(p->to[c]) {
Node *q = p->to[c];
if(q->maxl == p->maxl + 1) return q; /*q->right++*/
Node *np = new(pis++) Node(*q);
np->maxl = p->maxl + 1, q->par = np;
for(; p && p->to[c] == q; p = p->par) p->to[c] = np;
return np;
}
当然,我们可以忽视不用创建节点的情况,每次都创建一个节点,后果就是有可能它的max跟它的父亲相同,这样没有状态能转移到它,它也不表示任何一个子串,它存在的意义只是为它的祖先贡献了的right集合一个位置,当然它在parent树中还必须起一个连接作用。代码可以完全不改变。
而按照最简状态后缀自动机的定义,这种状态是不应该存在的,但是存在的话问题也不大。
另外,在一棵严格的trie树(没有相同的儿子)上按照深度建立后缀自动机是不用考虑上面的情况的,因为这种情况一定不会出现。
下面是bzoj3926 [ZJOI2015]诸神眷顾的幻想乡 的代码,作为参考。
#include<bits/stdc++.h> typedef long long LL;
using namespace std; const int N = + ; namespace sam {
struct Node {
int maxl;
Node *par, *to[]; Node() {}
Node(int maxl) : maxl(maxl) {}
} pool[N * ], *pis, *root; void init() {
pis = pool;
root = new(pis++) Node();
} Node *extend(Node *p, int c) {
if(p->to[c]) {
Node *q = p->to[c];
if(q->maxl == p->maxl + ) return q; /*q->right++*/
Node *np = new(pis++) Node(*q);
np->maxl = p->maxl + , q->par = np;
for(; p && p->to[c] == q; p = p->par) p->to[c] = np;
return np;
} else {
Node *np = new(pis++) Node(p->maxl + );
for(; p && !p->to[c]; p = p->par) p->to[c] = np;
if(!p) np->par = root;
else {
Node *q = p->to[c];
if(q->maxl == p->maxl + ) np->par = q;
else {
Node *nq = new(pis++) Node(*q);
nq->maxl = p->maxl + ;
q->par = np->par = nq;
for(; p && p->to[c] == q; p = p->par) p->to[c] = nq;
}
}
return np;
}
} LL solve() {
LL res = ;
for(Node *p = pool + ; p != pis; ++p) {
res += p->maxl - p->par->maxl;
}
return res;
}
} struct Edge {int to; Edge *next;} pool[N * ], *fir[N], *pis = pool;
void AddEdge(int u, int v) {pis->to = v, pis->next = fir[u], fir[u] = pis++;} int ch[N], deg[N]; void dfs(int u, int fa, sam::Node *p) {
sam::Node *last = sam::extend(p, ch[u]);
for(Edge *p = fir[u]; p; p = p->next) {
int v = p->to;
if(v != fa) dfs(v, u, last);
}
} int main() {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
#endif int n; scanf("%d%*d", &n);
for(int i = ; i <= n; i++) scanf("%d", ch + i);
for(int i = ; i < n; i++) {
int u, v; scanf("%d%d", &u, &v);
AddEdge(u, v), AddEdge(v, u);
++deg[u], ++deg[v];
}
sam::init();
for(int i = ; i <= n; i++) if(deg[i] == ) {
dfs(i, , sam::root);
}
cout << sam::solve() << endl;
return ;
}
bzoj3926
bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解的更多相关文章
- BZOJ3926 Zjoi2015 诸神眷顾的幻想乡【广义后缀自动机】
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 【广义后缀自动机】
题目 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴 ...
- BZOJ3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- BZOJ3926 ZJOI2015诸神眷顾的幻想乡(广义后缀自动机)
对多串建立SAM的一种方法是建trie再对trie建SAM.构造方式分为在线(也即不建trie而是依次插入每个串,或在trie上dfs)和离线(也即建好trie再bfs).其中离线构造与单串的构造方式 ...
- 2018.12.22 bzoj3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
传送门 题意简述:给出一棵trietrietrie树,每个点表示一个字符,求树上所有路径组成的不同字串数.(叶子数≤20\le 20≤20) 由于有一个神奇的条件,考虑以每一个叶子为树根统计每个点到树 ...
- [ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
/* 题目中的神仙性质真的是令人愉悦 因为我一眼看成了每个点的度数不超过二十, 心想这他喵的和字符串什么关系 统计树上不同子串个数, 按道理直接dfs n次把所有的串插到后缀自动机里就行了 但是我们发 ...
- 【BZOJ3926】诸神眷顾的幻想乡 【广义后缀自动机】
题意 给定一棵树,每个结点有一个颜色,问树上有多少种子串(定义子串为两点上路径颜色的序列).保证叶子结点<=20 分析 我们可以发现一个结论,任意一个子串一定是以某个叶子结点为根的trie的后缀 ...
- 【BZOJ 3926】 [Zjoi2015]诸神眷顾的幻想乡 (广义SAM)
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 974 Solved: 573 Descriptio ...
- BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 字符串 SAM
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3926.html 题目传送门 - BZOJ3926 题意 给定一个有 $n$ 个节点,最多只有 $20$ ...
随机推荐
- simplest_dll 最简dll的创建与隐式调用(显式调用太麻烦,个人不建议使用)
首先需要有个头文件,名字随便写 假设test.h //test.h #ifndef _TEST_H #define _TEST_H #ifdef TEST_EXPORTS //通过宏定义控制是输入还 ...
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- BZOJ 1729: [Usaco2005 dec]Cow Patterns 牛的模式匹配
Description 约翰的N(1≤N≤100000)只奶牛中出现了K(1≤K≤25000)只爱惹麻烦的坏蛋.奶牛们按一定的顺序排队的时候,这些坏蛋总会站在一起.为了找出这些坏蛋,约翰让他的奶牛排好 ...
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-008-带参数的ADVICE
一. 假设有情形如:cd里有很多轨,当播放音乐时,要统计每个音轨的播放次数,这些统计操作不应放在播放方法里,因为统计不是播放音乐的主要职责,这种情况适合应用AOP. 二. 1. package sou ...
- oracle database resident connection pooling(驻留连接池)
oracle在11g中引入了database resident connection pooling(DRCP).在此之前,我们可以使用dedicated 或者share 方式来链接数据库,dedic ...
- C#中的OLEDB连接2
在通过ADO对Excel对象进行连接时(此时Excel则认为是一个数据源),需要配置对Excel数据源对应的连接串,这个连接串中包括了Provider信息(其实类似对数据库进行连接操作时,都需要指定连 ...
- Github是什么?看完你就了解一些了
要了解Github,我们首先要知道Git,Git是管理代码的工具,写代码不是件轻松的事儿,一个人写的时候已经不轻松了,一群人写就更不轻松了,但这世界上很多事都是怎么不轻松怎么来的,大部分人都会和别人一 ...
- ☀【Grunt】no such file or directory, imagemin
JPG image optimization not workinghttps://github.com/gruntjs/grunt-contrib-imagemin/issues/16 npm un ...
- 期待已久的2012年度最佳jQuery插件揭晓
近日,国外著名博客WDL发布了2012年度最佳 jQuery 插件.jQuery 自2006年发布以来,经过6年的迅速发展,目前已是最流行和使用最广泛的 JavaScript 框架,这主要归功于众多围 ...
- 设置oracle11g空表exp导出
1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是 ...