好像序列自動機還沒有寫過…
串長為n的串共有n+1個節點,除了串中的n個節點,還有乙個空的根節點放在串首。每個節點至多有26條出邊,每條邊連向它之後的第乙個字元。
串中的任意乙個子串行對應了一條根到某個節點的路徑。且每條路徑對應乙個不同的子串行。
每個節點的parent是這個字母上一次出現的位置。更新只要沿parent指標掃瞄即可。
fjoi2016 所有公共子串行問題
這題暴力建trie能過80真是悲傷(因為按fjoi命題風格這題沒有寫資料範圍
建完序列自動機暴力dp即可
#include #include#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define sz 3333
int ys[2333],fys[2333
];#define m 60
struct
seq_a_m
void ins(char
c) lst[c]=c;
}}s_a,s_b;
intn,m;
typedef
long
long
ll;ll dp[sz][sz];
char
x[sz],y[sz];
ll getdp(
int a,int
b)char s[233333
];void tryy(int a,int b,int
cl)}
intmain()
四校聯考 公共串問題
還是暴力dp。注意一些細節。
#include #include#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int mod=998244353
;#define sz 4008
#define s 26 //
字符集structam;
struct seqam: public
amvoid ins(char
c) lst[c]=c;
}void
getcnt()
}}seqa,seqb;
struct sufam: public
amvoid ins(charc)}
void
getcnt()
}}sufa,sufb;
void prtat(am&s)
}am *cur,*curb;
intdp2[sz][sz];
int dfs(int a,int
b)int getdp(am& a,am&b)
char
a[sz],b[sz];
void prt(int
a)int
main()
bzoj4032 最短不公共子串
#include #include#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int mod=998244353
;#define sz 4008
#define s 26 //
字符集structam;
struct seqam: public
amvoid ins(char
c) lst[c]=c;
}void
getcnt()
}}seqa,seqb;
struct sufam: public
amvoid ins(charc)}
void
getcnt()
}}sufa,sufb;
void prtat(am&s)
}int
dep[sz][sz];
int qa[sz*sz],qb[sz*sz];
int bfs(am& a,am&b)
}return -1;}
#define prt(x) printf("%d\n",x)
char
a[sz],b[sz];
intmain()
AC自動機及字尾自動機
ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...
字尾自動機
基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...
字尾自動機
常用於處理字串問題,可以高效解決許多字串問題。有點像將乙個字串的所有字尾都建在乙個ac自動機上,但不同的是字尾自動機的節點數最多為2 n,因為它只記錄需要記錄的點,一些沒有記錄東西的點可以視為與下面有價值的節點並在一起,這樣大大降低了時間複雜度和空間複雜度。對於每乙個節點記錄它的後面加上每個字元後字...