字典樹(AC自動機)的兩種實現方式

2021-10-01 02:18:23 字數 2429 閱讀 8358

字典樹主要用與字串的儲存,,查詢。

第乙個:使用陣列;

將根結點編號為0,然後把其餘結點(包括葉子節點和非葉子節點)編號為從1開始的正整數,然後用乙個陣列來儲存每個結點的所有子節點,用下標直接訪問。

ch[i][j]儲存結點i的那個編號為j的子結點的編號什麼叫「編號為j」呢?比如,若是處理全部

由小寫字母組成的字串,把所有小寫字母按照字典序編號為0,1,2,…,則ch[i][0]表示結點編號為i的a的下乙個節點的編號。如果這個子結點不存在,則ch[i][0]=0。

sigma_size表示字符集的大小,比如,當字符集為全體小寫字母時,sigma_size=26。

maxnode:表示節點的總個數

struct trie

int idx(char c)

// 插入字串s,附加資訊為v。注意v必須非0,因為0代表「本結點不是單詞結點」

void insert(const char *s, int v)

u = ch[u][c]; // 往下走

}val[u] = v; // 字串的最後乙個字元的附加資訊為v

}// 找字串s的長度不超過len的字首

void find_prefixes(const char *s, int len, vector&ans)}};

第二種是樹:

#include using namespace std;

struct node

}*q[500010];

node *root;

int head, tail;

char str[1000005];

void insert(char *str)

++p->cnt;

} void build(node* root)

p = p->fail;

}if (p == null)temp->next[i]->fail = root;

}q[tail++] = temp->next[i];}}

}}

int query(node *root)

++i;

}return cnt;

} int main()

build(root);

scanf("%s", str);

printf("%d\n", query(root));

}return 0;

}

ac自動機參考部落格

題意第一行輸入測試資料的組數,然後輸入乙個整數n,接下來的n行每行輸入乙個單詞,最後輸入乙個字串,問在這個字串中有多少個單詞出現過

#include

using namespace std;

const

int maxn =

1e7+5;

const

int max =

10000000

;int cnt;

struct node

;node *root;

char key[70]

;node *q[max]

;int head,tail;

node *newnode;

char pattern[maxn]

;int n;

void

insert

(char

*s) p = p->next[x];}

p->sum++;}

void

build_fail_pointer()

else

p = p->fail;}if

(p ==

null

) temp->next[i]

->fail = root;

} q[tail++

]= temp->next[i];}

}}}void

ac_automation

(char

*ch)

else

break

; temp = temp->fail;}}

}int

main()

gets

(pattern)

; cnt =0;

build_fail_pointer()

;ac_automation

(pattern)

;printf

("%d\n"

,cnt);}

return0;

}

AC自動機(KMP 字典樹)

ac自動機 kmp 字典樹 題目 輸入n個串,判斷有多少個搜尋串的子串 in out 1 47a ababc abcd abcde abcdef abcdefg abcd includeusing namespace std char str 1000000 100 struct node root...

字典樹問題與AC自動機

利用字串的公共字首來避免無謂的字串比較,降低查詢時間。字典樹節點 每個節點對應乙個最大可儲存字元陣列。假設字典只存26個小寫英文本母,那麼每個節點下應該有乙個長度為最大26的陣列。換言說,可存的元素型別越多,單個節點占用記憶體越大。如果用字典樹儲存漢字,那麼每個節點必須為數千個常用漢字開闢乙個陣列作...

字典樹哇 AC自動機哇

字典樹 原理 按照每個根向下發散 形成一棵 樹 這個題 需要在每乙個字母處都做統計 求字首單詞 開乙個 二維陣列和ant來 模擬樹 root開始為0 作為 起點 t str i a 作為分支 關鍵就是 ant 這是形成樹的關鍵 ant用來區分每乙個節點 這樣二維陣列 tree才能 真正構建完成 很神...