hdu1251 字典树

很是头疼指针,今天写了写发现其实没那么难、、、

如果心中充满了对某事物的畏惧,那么这个事情就很难完成,要有藐视困难的决心,和战胜困难的毅力!吖飒!加油~~~

题意:

统计某个前缀出现的次数。

分析:

很明显需要用字典树写,节省空间节省时间的有效方法。

这里洗需要解决一个问题,记录前缀出现的次数,也就是说,建树时,如果该字母出现过,data+1,如果没出现,data=1;

查找的时候,最后一个字母的data即为所求。

代码(能当字典树模板看):

#include<iostream>
#include<string.h>
using namespace std;
struct Trie
{
    int data;
    Trie * next[26];
}*p;//声明
void create(char str[],int k,Trie *Head)
{
    while(k<strlen(str))
    {
        if(Head->next[str[k]-'a']!=NULL)
        {
            Head->next[str[k]-'a']->data+=1;
            Head=Head->next[str[k]-'a'];        
        }
        else
        {
            Head->next[str[k]-'a']=new Trie; // 用Head->next[str[k]-'a']开辟新节点
			Head=Head->next[str[k]-'a'];//改变指向,Head指向新节点
            for(int j=0;j<26;j++)    Head->next[j]=NULL;
            Head->data=1;       
        }
		k++;
    }
}
int search(char str[],int k,Trie* w)
{
	while(k<strlen(str))
        if(w->next[str[k]-'a']!=NULL)
            w=w->next[str[k++]-'a'];
        else return 0;
		return w->data;
}
int main()
{
    int i;
    char animal[15];
    p=new Trie;//申请空间
    for(i=0;i<26;i++) p->next[i]=NULL;//分配内存
    while(gets(animal)&&animal[0]!='\0')
    {
        create(animal,0,p);
        memset(animal,'\0',sizeof(animal));
    }
    while(~scanf("%s",animal))
    {
        printf("%d\n",search(animal,0,p));
    }
    return 0;
}


你可能感兴趣的:(null,search)