1. 程式人生 > >HDU 1251 統計難題(字典樹)

HDU 1251 統計難題(字典樹)

#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;
}