codevs 4189 字典【字典樹】

Enjoy_process發表於2018-09-03

 時間限制: 1 s

 空間限制: 256000 KB

 題目等級 : 大師 Master

題解

 

Description

最經,skyzhong得到了一本好厲害的字典,這個字典裡整整有n個單詞(1<=n<=200000)

現在skyzhong需要在字典裡查詢以某一段字母開頭的單詞

如:skyzhong想查詢a

那麼只要是a開頭的單詞就可以了

skyzhong只想知道里面有沒有這一個單詞(因為沒有他就不查了)

若有,請輸出YES。若沒有,請輸出NO

 

Input Description

第一行一個數n

第二行到第n+1行,一行一個字串

再下一行一個數m,表示skyzhong想要查詢的次數

接著m行,一行一個字串,表示skyzhong想要查的東西

 

Output Description

共m行,若有這字串輸出YES,否則輸出NO

 

Sample Input

3
asd
asfdghj
asfd
3
asd
asdghj
asf

 

Sample Output

YES
NO
YES

資料範圍及提示 Data Size & Hint

字串只有小寫字母,且長度≤8

 

題目連結:codevs 4189 字典

題解:字典樹模板題

AC的C語言程式碼:

#include<stdio.h>
#include<string.h>
#define N 600005
int trie[N][26];
int tot;

void insert(char *s,int rt)
{
	int i;
	for(i=0;s[i];i++){
		int x=s[i]-'a';
		if(!trie[rt][x])
		  trie[rt][x]=++tot;
		rt=trie[rt][x];
	}
}

int find(char *s)
{
	int i,rt=0;
	for(i=0;s[i];i++){
		int x=s[i]-'a';
		if(!trie[rt][x])
		  return 0;
		rt=trie[rt][x];
	}
	return 1;
}

int main()
{
	int n,m;
	char s[20];
	tot=0;
	scanf("%d",&n);
	while(n--){
		scanf("%s",s);
		insert(s,0);
	}
	scanf("%d",&m);
	while(m--){
		scanf("%s",s);
		if(find(s))
		  printf("YES\n");
		else
		  printf("NO\n");
	}
	return 0;
}
 

 

相關文章