hdoj 2072 水题但是有点坑 Trie树

单词数

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 63793    Accepted Submission(s): 15905

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

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

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

Sample Input

you are my friend #  

Sample Output

4  

Author Lily  

Source
浙江工业大学网络选拔赛  

Recommend

linle   |   We have carefully selected several similar problems for you:  1020 1075 2096 1247 1004 

一开始用map过的 今天试试字典树

有点坑 字典树还是比较好弄的 就是输入麻烦

1."              "
0
2."  asdf as a"
3
3."  asdf     asdf  ds"
2
4."asdf   asdf    "
1
5.直接输回车
0

还有一组关键的 a      a a             a            a                            a

答案为1

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int MAX_N = 2000006;
int tree[MAX_N][30];
int cnt[MAX_N];
char str[MAX_N];
int tot;
void Insert(string str){
    int len = str.length();
    int root = 0;
    for(int i = 0;i<len;++i){
        int id = str[i]-'0';
        if(!tree[root][id]) tree[root][id] = ++tot;
        root = tree[root][id];
    }
    cnt[root]=1;
}
int Find(string str){
    int len = str.length();
    int root = 0;
    for(int i = 0;i<len;++i){
    int id = str[i] - '0';
    if(!tree[root][id]) return 0;
    root = tree[root][id];
    }
    return cnt[root];
}
void init(){
   for(int i= 0;i<=tot;i++){
    cnt[i] = 0;
    for(int j =0;j<26;j++)
        tree[i][j] = 0;
   }
}
int main(){
    tot = 0;
    int num = 0;
    string arr,str;
    while(getline(cin,arr)&&arr[0]!='#'){
        str="";
        int len = arr.length();
        for(int i= 0;i<len;++i){
          if(isalpha(arr[i])){
            int j ;
            for(j=i;isalpha(arr[j]);j++)
                str+=arr[j];
           // printf("%s\n",str.c_str());
            i = j;
            if(!Find(str)) {
                num++;
                Insert(str);
            }
            str="";
          }
        }
        cout << num << endl;
        num = 0;
        init();
    }
    return 0;
}
    原文作者:Trie树
    原文地址: https://blog.csdn.net/heucodesong/article/details/81009016
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞