忘了部落格位址了。
後續可能上公升為總結。
**比較複雜,細節很多,建議背下來。
【模板】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...