hihoCoder1014 Tire树

题目连接:hihoCoder1014




分析:建立一颗词典树,对于每一次询问,输出以该询问对应字符串的num值即可。


实现代码如下:

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
#define son_num 30 //字符串中包含的字符个数
#define maxn 10 //单词的最大长度
struct tire
{
    int num; //纪录到达该节点的字符串的个数,即相同前缀数
    bool terminal; //如果terminal=true,表示当前点为该字符串最后一个字符
    struct tire *next[son_num]; //纪录下一个节点
};
tire *root;
tire *init() //创建新节点
{
    tire *p=(tire *)malloc(sizeof(tire));
    for(int i=0;i<son_num;i++)
      p->next[i]=NULL;
    p->terminal=false;
    p->num=0;
    return p;
}
void insert(tire *root,char str[]) //插入操作
{
    int i=0;
    tire *p=root;
    while(str[i]!='\0')
    {
        if(!p->next[ str[i]-'a' ]) //如果不存在,建立新节点
          p->next[ str[i]-'a' ]=init();
        p=p->next[ str[i]-'a' ];
        p->num++;
        i++;
    }
    p->terminal=true;
}
bool find(tire *p,char str[]) //查找操作
{
    int i=0;
    while(str[i]!='\0'&&p->next[ str[i]-'a' ])
    {
        p=p->next[ str[i]-'a' ];
        i++;
    }
    if(str[i]=='\0') printf("%d\n",p->num);
    else puts("0");
}
void del(tire *root) //清空操作
{
    for(int i=0;i<son_num;i++)
      if(root->next[i]!=NULL)
        del(root->next[i]);
    free(root);
}
int main()
{
    root=init();  //创建根结点
    char str[maxn];
    int n,m; //n为建立字典树的单词数,m为要查找的单词数
    cin>>n;
    for(int i=0;i<n;i++) //建立字典树
    {
        scanf("%s",str);
        insert(root,str);
    }
    cin>>m;
    for(int i=0;i<m;i++) //查找操作
    {
        scanf("%s",str);
        find(root,str);
    }
    del(root); //释放字典树占用的空间
    return 0;
}


你可能感兴趣的:(hihoCoder1014 Tire树)