HDU

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).


Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

Output
对于每个提问,给出以该字符串为前缀的单词的数量.

Sample Input
banana
band
bee
absolute
acm

ba
b
band
abc
Sample Output
2
3
1
0

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

typedef struct Node* node;

char s[15];
char j[15];

struct Node
{
	int Num;
	node Next[26];
	Node()
	{
		Num = 0;
		memset(Next,NULL,sizeof(Next));
	}
};



void Insert(node root)
{
	node p = root;
	int len = strlen(s);
	for(int i=0 ; i<len ; i++)
	{
		int mid = s[i] - 'a';
		if(p->Next[mid] == NULL)p->Next[mid] = new struct Node();
		p = p->Next[mid];
		p->Num++;
	}
}

int Judge(node root)
{
	int len = strlen(j);
	node p = root;
	for(int i=0 ; i<len ; i++)
	{
		int mid = j[i] - 'a';
		if(p->Next[mid])p = p->Next[mid];
		else return 0;
	}
	return p->Num;
}

int main()
{
	node root = new struct Node();
	while(gets(s) && strcmp(s,""))
	{
		Insert(root);
	}
	while(scanf("%s",j)!=EOF)
	{
		printf("%d
",Judge(root));
	}
	return 0;
}

原文地址:https://www.cnblogs.com/vocaloid01/p/9514069.html