HDU 2072 单词数 字典树

来源:互联网 发布:数控车床内螺纹编程 编辑:程序博客网 时间:2024/05/16 01:03
G - 单词数
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

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

Input

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

Output

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

Sample Input

you are my friend#
 

Sample Output

4
 



复习复习字典树

ACcode:

#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <stdlib.h>#define id str[i]-'a'#define ma (trie *)malloc(sizeof(trie))#define MAX 26using namespace std;struct trie{    trie *next[MAX];    int v;    void init(){        v=0;        for(int i=0;i<MAX;++i)this->next[i]=NULL;    }};trie *root;int ans;void createTrie(char *str){    trie *p=root,*q;    int len=strlen(str);    for(int i=0;i<len;++i){        if(p->next[id]==NULL){            q=ma;            q->init();            p->next[id]=q;            p=p->next[id];        }        else            p=p->next[id];    }    if(p->v==0)       ans++;    p->v++;}int find_trie(char *str){    trie *p=root;int i;    for( i=0;str[i]!=0;++i){        if(p->v!=0)return 0;        p=p->next[id];    }    return 1;}void deal(trie *t){    if(t==NULL)return ;    for(int i=0;i<MAX;++i)        if(t->next[i])            deal(t->next[i]);    free(t);}char s[5500][40];int main(){    string a;    while(getline(cin,a)&&a[0]!='#'){        root=ma;        root->init();        int len=a.length();        int cnt=0;ans=0;        for(int i=0;i<len;++i){            while(a[i]==' ')i++;            if(i>=len)break;            int pos=0;            while(a[i]!=' '&&i<len)s[cnt][pos++]=a[i++];            s[cnt][pos]='\0';            if(pos)                createTrie(s[cnt++]);        }        printf("%d\n",ans);        deal(root);    }    return 0;}


0 0