トライ・トライ

トライは辞書は方法やコンテンツを見つけることがあるため、複数の文字列を検索するためにカウントするために使用して、それがトライと呼ばれたい高度なデータ構造であります

だから、 - あなたが見上げる限り、あなたはトライます

マップを見てください

ここに画像を挿入説明
さて、ここで上記のように、我々はそれを行う方法は、辞書に私たちは言葉を挿入したい、辞書を持っている、例えば、我々は、我々が「華を見つけるために、「明確な」言葉に最初に行くよ「清華大学パーク」を挿入します「しかし、何の庭園がありませんので、私たちも、以下に中国に駐車することはできません

だから、挿入トライしてポイントを構築していない場合、文字は、ダウンして行く。このほとんどすべての時間

コードの場合:

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;
公開された18元の記事 ウォンの賞賛3 ビュー1263

おすすめ

転載: blog.csdn.net/devout_/article/details/100015832