现在的位置: 首页 > 综合 > 正文

hdu1251

2013年10月02日 ⁄ 综合 ⁄ 共 1411字 ⁄ 字号 评论关闭

 

意:统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

字典树 今天晚上刚学的。。算法无涯啊。好多东西都不知道。
/*

Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output

2
3
1
0
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct dirtree
{
    struct dirtree *child[26];
    int n;
};
struct dirtree *root;
void Insert(char*source)
{
     int i,j,len;
     len=strlen(source);
     if(len==0)return ;
     struct dirtree *current,*newnode;
     current=root;
     for(i=0;i<len;i++)
     {
        if(current->child[source[i]-'a']!=0)
        {
           current=current->child[source[i]-'a'];
           current->n=current->n+1;
        }
        else
        {
           newnode=(struct dirtree*)malloc(sizeof(struct dirtree));
           for(j=0;j<26;j++)
           {
              newnode->child[j]=0;
           }
           current->child[source[i]-'a']=newnode;
           current=newnode;
           current->n=1;
        }
     }
}
int Find(char *source)
{
    struct dirtree *current;
    int len=strlen(source);
    if(len==0)return 0;
    current=root;
    for(int i=0;i<len;i++)
    {
       if(current->child[source[i]-'a']!=0)
          current=current->child[source[i]-'a'];
       else
          return 0;
    }
    return current->n;
}
int main()
{
    char temp[11];
    int i,j;
    root=(struct dirtree*)malloc(sizeof(struct dirtree));
    for(i=0;i<26;i++)
       root->child[i]=0;
    root->n=2;
    while(gets(temp),strcmp(temp,"")!=0)
        Insert(temp);
    while(scanf("%s",temp)!=EOF){
        i=Find(temp);
        printf("%d/n",i);
    }
    return 0;
}
        

抱歉!评论已关闭.