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 26
using 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;
}