模板 AC自動機

2021-10-11 22:23:55 字數 2136 閱讀 5680

忘了部落格位址了。

後續可能上公升為總結。

**比較複雜,細節很多,建議背下來。

【模板】ac自動機(簡單版)

由勢能分析可知,query 部分時間複雜度是 o(2

∗len

t)

o(2*lent)

o(2∗le

nt)統計 fai

lfail

fail

答案部分是長度和,因為只統計是否出現。

#include

using

namespace std;

const

int maxc=26;

const

int n=

1e6+5;

struct nodet[n]

;int root,tot=

1,res=

0,t,n;

queue<

int> q;

char article[n]

,word[n]

;void

insert

(char

*s) t[r]

.cnt++;}

void

build()

}}}void

query

(char

*s)}

}int

main()

// printf("yes");

scanf

("%s"

,article)

;build()

;// for(int i=1;i<=tot;i++) printf("fail[%d]=%d\n",i,t[i].fail);

query

(article)

;printf

("%d"

,res)

;}

【模板】ac自動機(二次加強版)

區別只在於加了乙個 top

otopo

topo

排序。

#include

using

namespace std;

const

int maxc=26;

const

int n=

2e6+5;

struct nodet[n]

;int root,tot=

1,res=

0,t,n,ans[n]

;int c[n]

;int in[n]

;queue<

int> q;

char article[n]

,word[n]

;int

insert

(char

*s) t[r]

.end=1;

return r;

}void

build()

}}}void

query

(char

*s)}

}int

main()

// printf("yes");

scanf

("%s"

,article)

;build()

;// for(int i=1;i<=tot;i++) printf("fail[%d]=%d\n",i,t[i].fail);

query

(article)

;while

(q.size()

) q.

pop();

for(

int i=

1;i<=tot;i++

) in[t[i]

.fail]++;

for(

int i=

1;i<=tot;i++)if

(!in[i]

) q.

push

(i);

while

(q.size()

)for

(int i=

1;i<=n;i++

)printf

("%d\n"

,t[ans[i]

].cnt)

;}

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...