zoukankan      html  css  js  c++  java
  • 字典树 (HDU 2072)

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

    Input有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。Output每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。Sample Input
    you are my friend
    #
    Sample Output
    4

    题目分析 : 这题用 map 写时很方便的,为了联系字典树,用字典树写了一发。

    代码示例 :
    #define ll long long
    const int maxn = 1e5+5;
    const double pi = acos(-1.0);
    const int inf = 0x3f3f3f3f;
    
    char s[maxn], f[100];
    struct node
    {
        int next[26];
        int val;
    }t[maxn];
    int rt;
    int ans = 0, k;
    
    void build(){
        int u = 0, v;
        
        for(int i = 0; i < k; i++){
            v = f[i] - 'a';
            if (!t[u].next[v]){
                t[u].next[v] = rt++;
            }
            u = t[u].next[v];
        }
        t[u].val++;
        if (t[u].val == 1) ans++;
    }
    
    int main() {
        //freopen("in.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
        
        while(gets(s+1)){
            if (s[1] == '#') break;
            
            int len = strlen(s+1);
            memset(t, 0, sizeof(t));
            rt = 1;
            s[len+1] = ' ';
            k = 0; ans = 0;
            for(int i = 1; i <= len+1; i++){
                if (s[i] != ' '){
                    f[k++] = s[i];
                }
                else {
                    if (k != 0)build();
                    k = 0;
                }
            }
            cout << ans << endl;
        }
        return 0;
    }
    
    东北日出西边雨 道是无情却有情
  • 相关阅读:
    web测试知识点整理
    LINUX系统、磁盘与进程的相关命令
    压缩与解压
    LINUX基本操作命令
    linux命令管道工作原理与使用方法
    C#根据path文件地址进行下载
    C#向Word文档中的书签赋值
    网站发布
    乱码转换
    获取新增的数据ID
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/8559081.html
Copyright © 2011-2022 走看看