トライは辞書は方法やコンテンツを見つけることがあるため、複数の文字列を検索するためにカウントするために使用して、それがトライと呼ばれたい高度なデータ構造であります
だから、 - あなたが見上げる限り、あなたはトライます
マップを見てください
さて、ここで上記のように、我々はそれを行う方法は、辞書に私たちは言葉を挿入したい、辞書を持っている、例えば、我々は、我々が「華を見つけるために、「明確な」言葉に最初に行くよ「清華大学パーク」を挿入します「しかし、何の庭園がありませんので、私たちも、以下に中国に駐車することはできません
だから、挿入トライしてポイントを構築していない場合、文字は、ダウンして行く。このほとんどすべての時間
コードの場合:
inline void add(char s[]){
int len=strlen(s);
int u=1;
for(int i=0;i<len;i++){
int fin=s[i]-'a';
if(!trie[u][fin])trie[u][fin]=++num;
u=trie[u][fin];
}
end[u]++;
}
お問い合わせも非常に簡単です
inline int ask(int* s){
int u=1;
int ans=0;
Rep(i,1,s[0]){
if(!trie[u][s[i]])return ans;
u=trie[u][s[i]];
ans+=end[u];
}
return ans-end[u]+cnt[u];
}
トライは、同じ文言ではありませんので、照会される各トピックの内容は、同じではありませんので
、この質問のためのP2922 [USACO08DEC]秘密のメッセージ秘密のメッセージ
おそらく、このようになります(構造版)
struct dictionary_tree{
int trie[N][2];
int end[N],cnt[N];
int sum;
dictionary_tree(){
memset(trie,0,sizeof(trie));
memset(end,0,sizeof(end));
memset(cnt,0,sizeof(end));
}
inline void add(int* s){
int u=1;
Rep(i,1,s[0]){
if(!trie[u][s[i]])trie[u][s[i]]=++sum;
u=trie[u][s[i]];
cnt[u]++;
}
end[u]++;
}
inline int ask(int* s){
int u=1;
int ans=0;
Rep(i,1,s[0]){
if(!trie[u][s[i]])return ans;
u=trie[u][s[i]];
ans+=end[u];
}
return ans-end[u]+cnt[u];
}
}Trie;