统计难题(字典树)

统计难题(字典树)_第1张图片
统计难题(字典树)_第2张图片

#include
#include
#include
#include
using namespace std;

int trie[1000010][26];		//用数组定义一个字典树,存储下一个字符的位置
int num[1000010]={0};		//以某一个字符串为前缀的单词个数 
int pos=1;					//当前新分配的存储位置

void Insert(char str[]) 	//在字典树中插入某个单词
{
	int p=0;
	for(int i=0;str[i];i++)
	{
		int n=str[i]-'a';
		if(trie[p][n]==0)	//如果对应字符还没有值 
		{
			trie[p][n]=pos++;
		}
		p=trie[p][n];
		num[p]++;
	} 
} 
int Find(char str[])		//查询以某个字符串为前缀的单词数量 
{
	int p=0;
	for(int i=0;str[i];i++)
	{
		int n=str[i]-'a';
		if(trie[p][n]==0)
		{
			return 0;
		}
		p=trie[p][n];
	}
	return num[p];
}
int main()
{
    char str[11];
    while(gets(str))		
    {
    	if(str[0]==NULL)	//gets读到回车符(空行)会自动转化为NULL 
    		break;
    	Insert(str);		//在字典树中插入某个单词
    	
	}
	while(gets(str))		//待查询字符串 
	{
		printf("%d\n",Find(str)); 
	}
    return 0;
}

你可能感兴趣的:(字典树)