统计单词数
Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
Sample Output
4
主要就是字符串的处理…真恶心…要记住这次怎么处理的了 两种都可以
字典树用一个flag 这个单词出现过即flag=1不管它
未出现过则 ans++标记一下flag=1
#include <cstring>
#include <cstdio>
#include <iostream>
#define m(a,b) memset(a,0,sizeof b)
using namespace std;
char s[1000005];
//char ss[1005];
struct trie
{
bool flag;
trie *nex[26];
trie()
{
flag=0;
for(int i=0;i<26;i++)
nex[i]=NULL;
}
};
trie *root;
int ans;
void create(char *str,int p1,int p2)
{
trie *a=root;
for(int i=p1;i<=p2;i++)
{
int k=str[i]-'a';
if(a->nex[k]==NULL)
a->nex[k]=new trie();
a=a->nex[k];
}
if(!a->flag)
{
ans++;
a->flag=1;
}
}
void del(trie *a)
{
for(int i=0;i<26;i++)
if(a->nex[i]!=NULL)
del(a->nex[i]);
delete(a);
}
int main()
{
while(gets(s),s[0]!='#')
{
root=new trie();
ans=0;
int len=strlen(s),index=-1;
for(int i=0;i<len;i++)
{
if(s[i]==' ')
continue;
if(index==-1)
index=i;
if(s[i+1]==' '||s[i+1]=='\0')
{
if(index!=-1)
create(s,index,i);
index=-1;
}
}
printf("%d\n",ans);
del(root);
}
}
//int main()
//{
// while(gets(s),s[0]!='#')
// {
// root=new trie();
// int len=strlen(s);
// ans=0;
// for(int i=0;i<len;i++)
// {
// while(s[i++]==' ');
// i--;
// if(i==len)
// break;
// int j=0;
// while(s[i]!=' '&&i<len)
// ss[j++]=s[i++];
// ss[j]='\0';
// create(ss);
// }
// printf("%d\n",ans);
// del(root);
// }
//}