AC自動機模板

2021-08-28 05:05:08 字數 3282 閱讀 9179

#include

#include

#define ll long long int

#define max_n 1000050

#define max_tot 500050

#define met(a) memset(a,0,sizeof(a))

#define fup(i,a,n,b) for(int i=a;i#define fow(j,a,n,b) for(int j=a;j>0;j-=b)

#define mod(x) (x)%mod

using namespace std;

const

int maxn =

1e5+7;

struct ac stable[max_tot]

;int size;

//當前ac自動機節點個數

queue<

int>q;

void

init()

void

insert

(char

*s) stable[now]

.cnt++

;//結束位置++;

}void

build()

v = stable[v]

.fail;}if

(!stable[a]

.fail)stable[a]

.fail = stable[0]

.next[i]

; q.

push

(stable[u]

.next[i]);

//節點加進去}}

}}intget

(int u)

return res;

}int

match

(char

*s)if

(stable[now]

.cnt)res = res +

get(now);//

}return res;

}}ac;

char s[max_n]

;int

main

(int argc,

char

*argv)

應用:查詢母串中各單詞出現次數–對應題目p3796

/*

有 n 個由小寫字母組成的模式串以及乙個文字串 tt 。每個模式串可能會在文字串中出現多次。

你需要找出哪些模式串在文字串 t 中出現的次數最多。

輸入輸出格式

輸入格式:

輸入含多組資料。

每組資料的第一行為乙個正整數 n ,表示共有 nn 個模式串1≤n≤150 。

接下去 n 行,每行乙個長度小於等於70 的模式串。下一行是乙個長度小於等於1e6的文字串 tt 。

輸入結束標誌為 n=0 。

輸出格式:

對於每組資料,第一行輸出模式串最多出現的次數,接下去若干行每行輸出乙個出現次數最多的模式串,按輸入順序排列。

輸入輸出樣例

輸入樣例#1:

2aba

babababababac

6beta

alpha

haha

delta

dede

tata

dedeltalphahahahototatalpha

0輸出樣例#1

4aba

2alpha

haha

*/#include

#include

#define ll long long int

#define max_n 1000050

#define max_tot 500050

#define met(a) memset(a,0,sizeof(a))

#define fup(i,a,n,b) for(int i=a;i#define fow(j,a,n,b) for(int j=a;j>0;j-=b)

#define mod(x) (x)%mod

using namespace std;

const

int maxn =

1e5+7;

struct aa ans[

180]

;int

cmp(aa a, aa b)

struct ac stable[max_tot]

;int size;

//當前ac自動機節點個數

queue<

int>q;

void

init()

}void

insert

(char

*s,int n)

stable[now]

.cnt=n;

//結束位置++;

}void

build()

v = stable[v]

.fail;}if

(!stable[a]

.fail)stable[a]

.fail = stable[0]

.next[i]

; q.

push

(stable[u]

.next[i]);

//節點加進去}}

}}void

get(

int u)

return;}

intmatch

(char

*s)if

(stable[now]

.cnt)

get(now);}

return res;

}}ac;

char s[max_n]

;char s1[

200][80

];intmain

(int argc,

char

*argv)

ac.build()

;scanf

("%s"

, s)

; ac.

match

(s);

sort

(ans, ans + n+

1, cmp)

;printf

("%d\n"

, ans[0]

.cnt)

;printf

("%s\n"

, s1[ans[0]

.i])

;for

(int i =

1; i < n; i++)}

return0;

}

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