ac自動機模板

2021-08-28 10:36:28 字數 2054 閱讀 9910

#include #ifdef local

#define debug(x) cout<<#x<<" = "<<(x)const int mod = 1e9 + 7;

const int inf = 0x3f3f3f3f;

const ll infll = 0x3f3f3f3f3f3f3f3fll;

const int maxn = 2e6 + 5;

const int maxn = 2e6 + 100;

const int sigma_size = 26;

const int maxnode = 100000 * 50;

const int maxs = 150 + 10;

struct acautomata

// 字元c的編號

inline int idx (char c)

// 插入字串。v必須非0

void insert (char *s)

u = ch[u][c];

//printf("%d", u);

//puts("");

}val[u] += 1;

}// 遞迴列印匹配文字串str[i]結尾的字尾,以結點j結尾的所有字串

void print (int i, int j)

}// 在t中找模板

void find (char* t)

}// 計算fail函式

void getfail()

}// 按bfs順序計算fail

while (!q.empty() )

q.push (u);

int v = f[r];

while (v && !ch[v][c]) v = f[v];

f[u] = ch[v][c];

last[u] = val[f[u]] ? f[u] : last[f[u]];}}

}int query(char *s)

ac.getfail();

scanf ("%s", s );

printf("%d\n",ac.query(s));

}return 0;

}---------------------

分隔符------------

struct node  

*queue[500005];//佇列,方便用bfs構造失敗指標   

char s[1000005];//主字串   

char keyword[55];//需要查詢的單詞   

int head,tail;  

node *root;//頭結點  

---------------------

分隔符---------

第一步:構建tree

void build_trie(char *keyword)//構建trie樹   

p=p->next[v];//指標移動到下乙個結點   

}  p->cnt++;//單詞最後乙個結點cnt++,代表乙個單詞   

}  ---------------------

第二步,構建失敗指標

void build_ac_automation(node *root)  

p=p->fail;  

}  //讓該結點的失敗指標也指向root   

if(p==null)  

temp->next[i]->fail=root;  

}  queue[head++]=temp->next[i];//每處理乙個結點,都讓該結點的所有孩子依次入隊   

}  }  

}  }  ---------------------

第三步:查詢

int query(node *root)  

else//結點已訪問,退出迴圈   

break;  

temp=temp->fail;//回溯 失敗指標 繼續尋找下乙個滿足條件的結點   

}  }  

return count;  

}  ---------------------

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