HDU 1251 統計難題(字典樹)



Description

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

Input

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

注意:本題只有一組測試數據,處理到文件結束.
 

Output

對於每個提問,給出以該字符串爲前綴的單詞的數量.
 

Sample Input

banana band bee absolute acm ba b band abc

Sample Output

2 3 1 0

根據這道純字典樹的題來了解字典樹的基本模板,以下爲ac代碼
#include<stdio.h>
#include<string.h>

struct Node
{
	Node *next[26];//每個節點的分支由單詞性質決定,這裏是小寫的26個字母
	int cnt;//每個節點可以保存一些信息,這道題是保存該前綴的數量
	Node()
	{
		for(int i=0;i<26;i++) next[i]=NULL;
		cnt=0;
	}
};

Node root;

void insert(char *str)
{
	Node *p=&root,*q;
	int len=strlen(str);
	int id;
	for(int i=0;i<len;i++)
	{
		id=str[i]-'a';
		if(p->next[id]==NULL)
		{
			q=new Node;
			q->cnt++;
			p->next[id]=q;
			p=q;
		}
		else
		{
			p=p->next[id];
			p->cnt++;
		}
	}
}

int find(char *str)
{
	int len=strlen(str);
	Node *p=&root;
	int id;
	for(int i=0;i<len;i++)
	{
		id=str[i]-'a';
		if(p->next[id]!=NULL) p=p->next[id];
		else return 0;
	}
	return p->cnt;
}

int main()
{
	char str[11];
	if(gets(str)==NULL) return 0; //gets讀取EOF時返回值爲NULL
	while(str[0]!='\0')//用gets就可以讀取到‘\n’,此時轉換爲'\0'
	{
		insert(str);
		gets(str);
	}
	while(scanf("%s",str)!=EOF)
	{
		printf("%d\n",find(str));
	}
	return 0;
}







發佈了29 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章