字典樹(小結)

2021-08-18 06:08:51 字數 3528 閱讀 1587

0.1 字典樹

功能:在陣列中找與乙個數異或值最大的元素。

支援新增,刪除操作,查詢操作。

例如:hdu4825

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int max = 35*1e5+5;

ll a[max];

int root,tot,next[max][2],cnt[max];

ll end[max];

int newnode()

void init()

void insert(ll x)

void init()

int getid(char ch)

int isover(char s)

void insert(int p,char s)

int id = getid(s[0]);

if(next[p][id] == -1)

if(isover(s)) cnt[p] = 1;

insert(next[p][id],s+1);

}int search(int p,char s)

int id = getid(s[0]);

if(next[p][id] != -1)

if(next[p][27] != -1)

if(next[p][26] != -1) }

return 0;

}char s[1005];

int main()

printf("case #%d:\n",cas++);

for(int i = 0; i < m ;i++)

puts("");

}return 0;

}

再比如hdu2846字尾字典樹,查詢的是某單詞是字典中幾個單詞的子串,,字尾加排除重複,如果問的是子串出現的·次數,就不用排重

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int max = 25*1e5+5;

int root,tot,next[max][30],cnt[max],of[max];

int newnode()

void init()

int getid(char ch)

void insert(int p,char s,int cur)

return;

} int id = getid(s[0]);

if(next[p][id] == -1)

if(of[p] != cur) // 防止字典中的乙個單詞重覆記錄某個子串

insert(next[p][id],s+1,cur);

}int search(int p,char s)

int id = getid(s[0]);

if(next[p][id] != -1)

return 0;

}char s[1005];

char str[1005];

map mp;

int main()

} int m;

scanf("%d",&m);

while(m--)

return 0;

}

hdu 1305 求給定字串陣列某個元素是否是某個其它元素的字首,,儲存所有字首,查詢每個單詞,看出現次數是否均為1

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int max = 25*1e5+5;

int root,tot,next[max][3],cnt[max];

int newnode()

void init()

int getid(char ch)

void insert(int p,char s)

int id = getid(s[0]);

if(next[p][id] == -1)

cnt[p] ++;

insert(next[p][id],s+1);

}int search(int p,char s)

int id = getid(s[0]);

if(next[p][id] != -1)

return 0;

}char s[10005][20];

int main()

}if(yes) printf("set %d is immediately decodable\n",cas++);

else printf("set %d is not immediately decodable\n",cas++);

init();

k = 0;

} else

}return 0;

}

hdu1247-hat』s words

:這個可以先把單詞存好,逐個查詢,列舉分點,注意乙個單詞可以有 兩個一樣的單詞組成,,,如  aa   這種情況,如過陣列有乙個a就可以了.......

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int max = 25*1e5+5;

int root,tot,next[max][30],cnt[max];

int newnode()

void init()

int getid(char ch)

void insert(int p,char s)

int id = getid(s[0]);

if(next[p][id] == -1)

insert(next[p][id],s+1);

}int search(int p,char s)

int id = getid(s[0]);

if(next[p][id] != -1)

return 0;

}char s[50005][500];

char str[500];

int main()

for(int i = 0; i < k; i++)

}} return 0;

}

字典樹小結

字典樹,又稱單詞查詢樹,trie樹,是一種樹形結構,典型應用是用於統計,排序和儲存大量的字串,所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來節約儲存空間,最大限度的減少無謂的字串比較,查詢效率比雜湊表高。它有三個基本性質,根節點不包含字元,除根節點外每乙個節點都只包含乙個字...

字典樹小結

我理解的字典樹 儲存字串 或數字 能快速找到與之匹配的或者與之有某種關係的串。普通字典樹 解決匹配問題,01字典樹解決異或問題 模板 1.普通字典樹 tree i j 表示i標號的節點的第j個孩子 sum i i標號的節點經過了幾次。flag i i標號的節點是否是某個字串的最後乙個點。int tr...

01字典樹 小結

為了做13年南京網路賽的一道題 學了這個01字典樹 看了別人的模板 之後切了幾道水題 現在總結一下 01字典樹的實現可以看成是把乙個數的二進位制字元化後插入到一顆一般的字典樹中 比如在01字典樹種插入3時 相當於在字典樹中插入00 00011 一共33為,這個根據具體實現不同 查詢最大異或值的時候我...