hdu2072 字典树

这题印象深刻,我刚接触acm时,以为这题是水题(因为是中文,又短),一直没做出。现再想想也是。可能也是我以前字符串掌握不好;

这题其实也可以用stl里的map写。这里我用字典树写的。其实这题算简单题了吧。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct trie
{
    trie *next[26];
    int flag;//flag标记这里是否一个单词结束,也就是说到这里是否有一个单词;
};
trie *root;
void init()
{
    int i;
    root=(trie*)malloc(sizeof(trie));
    for(i=0;i<26;i++)
    {
        root->next[i]=NULL;
    }
    root->flag=0;
}
void insert(char *str)
{
    trie *p=root,*q;
    int i,j,len=strlen(str);
    for(i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if(p->next[id]==NULL)
        {
            q=(trie*)malloc(sizeof(trie));
            for(j=0;j<26;j++)
                q->next[j]=NULL;
            q->flag=0;
            p->next[id]=q;
        }
        p=p->next[id];
        if(i==len-1)
            p->flag=1;
    }
}
int query(char *str)
{
    int i,len=strlen(str);
    trie *p=root;
    for(i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if(p->next[id]==NULL)
            return 1;
        else
        {
            p=p->next[id];
        }
    }
    if(p->flag==1)
        return 0;
     return 1;
}
int main()
{
    int i,j,ans;
    char str[1000],s[100];
    while(gets(str))
    {
        ans=0;
        init();
        if(str[0]=='#')break;
        int len=strlen(str);
        int num;
        for(i=0;i<len;i++)
        {
            num=0;
            for(j=i;j<len;j++)
            {
                if(str[j]==' ')
                    break;
                s[num++]=str[j];//读取单词
            }
            i=j;
            s[num]='\0';
            //printf("%s ",s);
            if(strcmp(s,"")!=0&&query(s))//前面strcmp主要为了防止空格
            {
                insert(s);
                ans++;
            }
        }
        printf("%d\n",ans);
    }
}

 

posted @ 2015-07-30 14:54  sweat123  阅读(259)  评论(0编辑  收藏  举报