博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ3926】【ZJOI2015】—诸神眷顾的幻想乡(广义后缀自动机)
阅读量:4467 次
发布时间:2019-06-08

本文共 1600 字,大约阅读时间需要 5 分钟。


考虑怎么样才能构造出匹配所有字符的后缀自动机

发现显然问题出在树上分叉处,需要分别对几个儿子构造
而方向不同会导致问题

但是这道题保证叶子结点不到202020

从每个叶子节点开始dfsdfsdfs一次,对所有串建一个广义SamSamSam即可
注意构建方式,每个儿子继承父亲的lastlastlast

SamSamSam上一个点对应子串个数就是len[i]−len[fa[i]]len[i]-len[fa[i]]len[i]len[fa[i]]

#include
using namespace std;const int RLEN=1<<21|1;inline char gc(){
static char ibuf[RLEN],*ib,*ob; (ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin)); return (ib==ob)?EOF:*ib++;} #define gc getcharinline int read(){
char ch=gc(); int res=0,f=1; while(!isdigit(ch))f^=ch=='-',ch=gc(); while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc(); return f?res:-res;}#define ll long long#define pii pair
#define fi first#define se second#define pb push_back#define pob pop_back#define pf push_front#define pof pop_front#define mp make_pair#define bg begin#define re registerconst int N=4000005;int nxt[N][12],len[N],fa[N],tot;inline int insert(int c,int last){
int cur=++tot,p=last;len[cur]=len[p]+1; for(;p&&!nxt[p][c];p=fa[p])nxt[p][c]=cur; if(!p)fa[cur]=1; else{
int q=nxt[p][c]; if(len[p]+1==len[q])fa[cur]=q; else {
int clo=++tot; memcpy(nxt[clo],nxt[q],sizeof(nxt[q])); fa[clo]=fa[q],len[clo]=len[p]+1; fa[q]=fa[cur]=clo; for(;p&&nxt[p][c]==q;p=fa[p])nxt[p][c]=clo; } }return cur;}const int M=200005;int n,c;int in[M],val[M];vector
e[M];void dfs(int u,int f,int last){
int p=insert(val[u],last); for(int i=0;i

转载于:https://www.cnblogs.com/stargazer-cyk/p/11145529.html

你可能感兴趣的文章
Chapter 9:Dielectrics
查看>>
Murphy's law
查看>>
app实现状态保持
查看>>
JavaScript设计模式(4)-桥接模式
查看>>
java实例_出错处理 [超过1000&除数为零]
查看>>
IOS6.0调用通讯录和之前的差别
查看>>
np金融量化分析
查看>>
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
查看>>
robotframework-ride添加日志与报告路径
查看>>
模板模式
查看>>
sql执行存储过程
查看>>
springboot学习小记
查看>>
java代码的快速排序理解
查看>>
Unitity 常用工具类
查看>>
a标签href拼接JS字符串
查看>>
写完了作业
查看>>
JS基础_for循环练习3
查看>>
suse11 sp4(虚拟机) 能ping通主机,但是主机ping不通suse虚拟机
查看>>
Web前端开发笔试&面试_04_20161019MTBS
查看>>
实习笔记 4: 事件驱动编程
查看>>