HDU 1251 統計難題 Tire模板題
阿新 • • 發佈:2020-07-13
Tire 是一種用於實現字串快速檢索的多叉樹結構。Tire的每個節點都擁有若干個字元指標,若在插入或檢索字串時掃描到一個字元c,就沿著當前節點的c字元指標,走向該指標指向的方向。
基本操作:
int trie[SIZE][26], tot = 1; bool End[SIZE]; void insert(char* str) { int len = strlen(str), p = 1; for (int k = 0; k < len; k++) { int ch = str[k] - 'a'; if (trie[p][ch] == 0) trie[p][ch] = ++tot; p= trie[p][ch]; } End[p] = true; } bool search(char* str) { int len = strlen(str), p = 1; for (int k = 0; k < len; k++) { p = trie[p][str[k] - 'a']; if (!p) return false; } return true; }
HDU 1251
在樹上每個節點儲存一個整數cnt,記錄該節點是多少個字串的末尾節點。 對於每個詢問,當遍歷到最後一個字元時,統計答案。
struct Node { int cnt; int idx; }; Node trie[1000010][26]; int tot = 1; bool End[1000010]; void insert(char* str) { int len = strlen(str), p = 1; for (int k = 0; k < len; k++) { int ch = str[k] - 'a'; if (trie[p][ch].idx == 0) trie[p][ch].idx = ++tot; trie[p][ch].cnt++; p = trie[p][ch].idx; } End[p] = true; } int search(char* str) { int sum = 0; int len = strlen(str), p = 1; for (int k = 0; k < len; k++) { if (k == len-1) return trie[p][str[k] - 'a'].cnt; p = trie[p][str[k] - 'a'].idx; if (p == 0) return 0; } //return End[p]; } char s[105]; int main() { //int f = 0; while (gets(s)) { if (s[0] == '\0') break; insert(s); } while (~scanf("%s", s)) { int res = search(s); printf("%d\n", res); } }