1. 程式人生 > 實用技巧 >HDU 1251 統計難題 Tire模板題

HDU 1251 統計難題 Tire模板題

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); } }