zoukankan      html  css  js  c++  java
  • 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]='';
                //printf("%s ",s);
                if(strcmp(s,"")!=0&&query(s))//前面strcmp主要为了防止空格
                {
                    insert(s);
                    ans++;
                }
            }
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    关于代码风格
    python笔记-glob模块
    python笔记-mysql安装与配置
    python笔记-shutil模块
    python笔记-os模块
    python笔记-内存分析
    python笔记-装饰器
    python笔记-正则表达式
    python笔记-迭代器-生成器-对象生成式
    python笔记-模块和包
  • 原文地址:https://www.cnblogs.com/sweat123/p/4689347.html
Copyright © 2011-2022 走看看