模板 AC自動機

2021-10-09 16:19:33 字數 2217 閱讀 2825

有n個模式串,再給出乙個文字串,現在我們想知道有多少個模式串在文字串**現過?

這就是乙個ac自動機的模板題了,我們可以將ac自動機建立出來,在上面建立fail指標,然後建立fail樹這樣的做法來解決這個問題。

具體的說一下,我們可以先建立trie樹,然後利用bfs建立ac自動機,然後再建立fail樹,然後我們利用文字串在ac自動機上進行fail的跳轉,我們可以知道它可以表示哪些節點,然後我們就可以利用這樣的字首匹配演算法來進行計算貢獻了。

注意,這裡用的是字首匹配演算法!

好了,那麼問題來了,今天我突發奇想,我想用字尾匹配該怎麼做呢?反過來建立ac自動機???啊這……

於是,我想,我們可以在sam的link樹上做手腳,我們不妨建立一棵gsam來解決這個問題。

於是的於是,問題就變成了對於每個字尾,找有多少個字尾出現過了,這就可以放在廣義字尾自動機上跑了。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )

#define pi 3.141592653589793

#define e 2.718281828459045

#define inf 0x3f3f3f3f

#define half (l + r)>>1

#define lsn rt<<1

#define rsn rt<<1|1

#define lson lsn, l, mid

#define rson rsn, mid+1, r

#define ql lson, ql, qr

#define qr rson, ql, qr

#define myself rt, l, r

#define pii pair#define mp(a, b) make_pair(a, b)

using namespace std;

typedef unsigned long long ull;

typedef unsigned int uit;

typedef long long ll;

const int maxn = 2e6 + 7;

const int maxp = maxn << 1;

int n, ans;

char s[maxn];

struct sam

st[maxp];

int siz = 1, last;

void init()

int dp[maxp];

bool quest[maxp] = ;

int extend(int c, int val, bool question)

int cur = siz++;

st[cur].len = st[last].len + 1;

dp[cur] += val;

quest[cur] |= question;

int p = last;

while (p && !st[p].next[c])

if (p == 0)

else

else

else

st[clone] = st[q];

st[q].link = clone;

st[clone].len = st[p].len + 1;

while (p != 0 && st[p].next[c] == q)}}

return last = cur;

}vectorto[maxp];

void bfs()

void dfs(int u)

if((u ^ 1) && quest[u]) ans += dp[u];

}} sam;

int main()

scanf("%s", s);

int len = (int)strlen(s);

sam.last = 1;

for(int i=0; isam.bfs();

ans = 0;

sam.dfs(1);

printf("%d\n", ans);

return 0;}/*

3acabaaa

abaaa

ans:2

*/

AC自動機模板

ac自動機模板 ac自動機模板 使用方法 1 init 初始化函式 2 insert str 插入字串函式 3 build 構建ac自動機 4 query str 返回出現的字串個數 使用需注意事項 1 注意輸入的字元的範圍,需對next和其二維大小及相關引數進行更改 2 注意next fail和e...

AC自動機模板

ac自動機主要是用於多模式串的匹配問題,按照我的理解,ac自動機就是在tire樹上實現kmp演算法,由於ac自動機加入了失敗指標,所以可以把他看成乙個狀態轉移的圖。給出模板 include include include include includeusing namespace std cons...

模板 AC自動機

我覺得ac自動機的難點和核心是構建失敗指標,父親的失敗指標的兒子 son2 中有和兒子 son1 相同的,即為son1的失敗指標 例 還是有個不懂的地方 第90行,跪求大佬賜教 include include include include include include include inclu...