热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BZOJ.3926.[ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)

题目链接要对多个串同时建立SAM,有两种方法:1.将所有串拼起来,中间用分隔符隔开,插入字符正常插入即可。2.在这些串的Tr

题目链接

要对多个串同时建立SAM,有两种方法:
1.将所有串拼起来,中间用分隔符隔开,插入字符正常插入即可。
2.在这些串的Trie上建SAM。实际上并不需要建Trie,还是只需要正常插入(因为本来就差不多?)。在要插入下一个串时需把las重新设为root。这就是广义后缀自动机。

对于本题,因为叶节点最多只有20个(别理解错了啊喂),以这些叶节点分别为根,DFS整棵树建Trie(当然原图就是),这样所有子串就在Trie上某条路径中。这样就成了求不同子串的个数。
当然还是不需要建Trie,依次插入SAM即可。如果当前有要插入点的转移,则不再新建np,而是直接用p(las)做np。否则会有很多重复节点(虽然不影响正确性吧)。
每次插入一个字符,其产生的子串一共有len[i]个(就是以它为右端点的后缀),不同的子串则有len[i]-len[fa[i]]个。所有节点的贡献求和即为答案。

注意会有20次建SAM,空间要够!还有longlong。

//221660kb 2580ms
#include
#include
#include
#include
//#define gc() getchar()
#define MAXIN 1000000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N&#61;1e5&#43;7,S&#61;N*20*2;int n,C,A[N],dgr[N],Enum,H[N],nxt[N<<1],to[N<<1];
char IN[MAXIN],*SS&#61;IN,*TT&#61;IN;
struct Suffix_Automaton
{int tot,las,fa[S],son[S][11],len[S];void Init(){tot&#61;las&#61;1;}int Insert(int p,int c){int las;if(son[p][c]){int q&#61;son[p][c];if(len[q]&#61;&#61;len[p]&#43;1) las&#61;q;else{int nq&#61;&#43;&#43;tot; len[las&#61;nq]&#61;len[p]&#43;1;memcpy(son[nq],son[q],sizeof son[q]);fa[nq]&#61;fa[q], fa[q]&#61;nq;//不要想当然写fa[p]&#61;nq q就代表np了 for(; son[p][c]&#61;&#61;q; p&#61;fa[p]) son[p][c]&#61;nq;}}else{int np&#61;&#43;&#43;tot; len[las&#61;np]&#61;len[p]&#43;1;for(; p&&!son[p][c]; p&#61;fa[p]) son[p][c]&#61;np;if(!p) fa[np]&#61;1;else{int q&#61;son[p][c];if(len[q]&#61;&#61;len[p]&#43;1) fa[np]&#61;q;else{int nq&#61;&#43;&#43;tot; len[nq]&#61;len[p]&#43;1;memcpy(son[nq],son[q],sizeof son[q]);fa[nq]&#61;fa[q], fa[np]&#61;fa[q]&#61;nq;for(; son[p][c]&#61;&#61;q; p&#61;fa[p]) son[p][c]&#61;nq;}}}return las;}void Calc(){long long ans&#61;0;for(int i&#61;2; i<&#61;tot; &#43;&#43;i) ans&#43;&#61;(long long)(len[i]-len[fa[i]]);printf("%lld\n",ans);}
}sam;inline int read()
{int now&#61;0;register char c&#61;gc();for(;!isdigit(c);c&#61;gc());for(;isdigit(c);now&#61;now*10&#43;c-&#39;0&#39;,c&#61;gc());return now;
}
inline void AddEdge(int u,int v)
{&#43;&#43;dgr[v], to[&#43;&#43;Enum]&#61;v, nxt[Enum]&#61;H[u], H[u]&#61;Enum;&#43;&#43;dgr[u], to[&#43;&#43;Enum]&#61;u, nxt[Enum]&#61;H[v], H[v]&#61;Enum;
}
void DFS(int x,int f,int rt)
{int t&#61;sam.Insert(rt,A[x]);for(int i&#61;H[x]; i; i&#61;nxt[i])if(to[i]!&#61;f) DFS(to[i],x,t);
}int main()
{n&#61;read(), C&#61;read(), sam.Init();for(int i&#61;1; i<&#61;n; &#43;&#43;i) A[i]&#61;read();for(int i&#61;1; i}

转:https://www.cnblogs.com/SovietPower/p/9240424.html



推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • Java 中的十进制样式 getZeroDigit()方法,示例 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 本问题涉及在给定的无向图中寻找一个至少包含三个节点的环,该环上的节点不重复,并且环上所有边的长度之和最小。目标是找到并输出这个最小环的具体方案。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文详细介绍了如何在Windows操作系统中配置和使用Lex(Flex)与Yacc(Bison),包括软件的下载、安装以及通过示例验证其正确性的步骤。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
author-avatar
手机用户2602922607
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有