zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    PHP 文件包含之文件路径截断(转)
    如何使用Linux通用后门(转zafe)
    利用sqlmap和burpsuite绕过csrf token进行SQL注入 (转)
    正则表达式30分钟入门教程<转载>
    php empty()和isset()的区别<转载>
    $_SERVER详细资料整理(转)
    [C语言(VC)] 打造自己的键盘记录器 (zaroty)
    metasploit(MSF)终端命令大全
    linux提权总结(外文)
    kettle菜鸟学习笔记1----相关准备知识
  • 原文地址:https://www.cnblogs.com/dilthey/p/9935822.html
Copyright © 2011-2022 走看看