HDU1251 統計難題 【字典樹】

Enjoy_process發表於2018-09-03

統計難題

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 57458    Accepted Submission(s): 20099


 

Problem Description

Ignatius最近遇到一個難題,老師交給他很多單詞(只有小寫字母組成,不會有重複的單詞出現),現在老師要他統計出以某個字串為字首的單詞數量(單詞本身也是自己的字首).

Input

輸入資料的第一部分是一張單詞表,每行一個單詞,單詞的長度不超過10,它們代表的是老師交給Ignatius統計的單詞,一個空行代表單詞表的結束.第二部分是一連串的提問,每行一個提問,每個提問都是一個字串.

注意:本題只有一組測試資料,處理到檔案結束.

Output

對於每個提問,給出以該字串為字首的單詞的數量.

Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

 Sample Output

2
3
1
0

 Author

Ignatius.L

問題連結:HDU1251 統計難題

題解:字典樹模板題

AC的C語言程式碼:

#include<stdio.h>
#include<string.h>
#define N 500000

int tot,n;
int trie[N][26];
int ans[N];

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;
		ans[trie[rt][x]]++;
		rt=trie[rt][x];
	}
}

int search(char *s)
{
	int rt=0,i;
	int len=strlen(s);
	for(i=0;i<len;i++){
		int x=s[i]-'a';
		if(!trie[rt][x])
		  return 0;
		rt=trie[rt][x];
	}
	return ans[rt];
}

int main()
{
	char s[15];
	while(gets(s)&&strlen(s)){
		insert(s,0);
	}
	while(gets(s)){
		printf("%d\n",search(s));
	}
	return 0;
}

 

相關文章