字典樹主要用與字串的儲存,,查詢。
第乙個:使用陣列;
將根結點編號為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才能 真正構建完成 很神...