HDU 2072 - 单词数 - [(有点小坑的)字典树模板题]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072

Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。

Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。

Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。

Sample Input
you are my friend
#

Sample Output
4

 

题解:

简单的方法可以直接用set容器。

当然也可以用字典树来做。

小坑的地方是有如下数据:

(直接输入引号内的内容)
1.
"              "
0

2.
"  asdf as a"
3

3.
"  asdf     asdf  ds"
2

4.
"asdf   asdf    "
1

5.
直接输回车
0

 

AC代码(set):

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
char str[maxn],s[32];
set<string> S;
int main()
{
    while(1)
    {
        gets(str);
        if(str[0]=='#') break;

        S.clear();
        int len=strlen(str);
        for(int i=0,tot=0;i<len;i++)
        {
            if(isalpha(str[i]))
            {
                s[tot++]=str[i];
                if(i+1==len || str[i+1]==' ')
                {
                    s[tot]='\0';
                    S.insert(s);
                }
            }
            else tot=0;
        }
        cout<<S.size()<<endl;
    }
}

 

AC代码(字典树):

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;

namespace Trie
{
    const int SIZE=maxn*32;
    int sz;
    struct TrieNode
    {
        bool ed;
        int nxt[26];
    }trie[SIZE];
    void init()
    {
        sz=1;
        memset(trie,0,sizeof(trie));
    }
    int insert(const string& s)
    {
        int p=1;
        for(int i=0;i<s.size();i++)
        {
            int ch=s[i]-'a';
            if(trie[p].nxt[ch]==0) trie[p].nxt[ch]=++sz;
            p=trie[p].nxt[ch];
        }
        if(trie[p].ed) return 0;
        else return trie[p].ed=1;
    }
};

char str[maxn],s[32];
int main()
{
    while(1)
    {
        gets(str);
        if(str[0]=='#') break;

        int ans=0;
        Trie::init();
        int len=strlen(str);
        for(int i=0,tot=0;i<len;i++)
        {
            if(isalpha(str[i]))
            {
                s[tot++]=str[i];
                if(i+1==len || str[i+1]==' ')
                {
                    s[tot]='\0';
                    ans+=Trie::insert(s);
                }
            }
            else tot=0;
        }
        cout<<ans<<endl;
    }
}

 

posted @ 2018-11-09 16:32  Dilthey  阅读(365)  评论(0编辑  收藏  举报