• 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]='';
                        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]='';
                        ans+=Trie::insert(s);
                    }
                }
                else tot=0;
            }
            cout<<ans<<endl;
        }
    }
  • 相关阅读:
    构建之法阅读笔记03
    12.16第三周总结
    构建之法阅读笔记02
    12.9第二周周总结
    四则运算2
    构建之法阅读笔记01
    12.2第一周总结
    课堂练习-增加信息
    软件工程00
    web自动化测试---web页面元素的定位
  • 原文地址:https://www.cnblogs.com/dilthey/p/9935822.html
Copyright © 2020-2023  润新知