http://acm.hdu.edu.cn/showproblem.php?pid=2072
这个题我是用的字典树的方法来做的,首先一个字母一个字母判断,没有则创建,有则直接进入这一层。同时到单词结束时进行判断是否以前出现过。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int sum; //不同单词的总数
char s[100000];
char st[500];
struct node
{
int n; //用于标记从根到这里的单词出现的次数
node *next[26];
};
node root;
void tree(char *s, int len)
{
int i,j,id;
node *p,*q;
p = &root;
for(i = 0; i<len; i++)
{
id = s[i]-'a';
if(p->next[id]==NULL) //如果为空,则创建树,否则进入
{
q=(node *)malloc(sizeof(node));
q->n = 0;
for(j = 0; j<26; j++)
{
q->next[j] = NULL;
}
p->next[id] = q;
p=p->next[id];
}
else
{
p = p->next[id];
}
}
if(p->n==0)//如果这个单词没有出现过,则总数加一
{
sum++;
p->n++;
}
else
{
p->n++;
}
return ;
}
int main()
{
int n,i,j;
while(1)
{
sum = 0;
gets(s);
if(s[0]=='#')
{
break;
}
n = strlen(s);
for(i = 0; i < 26; i++) //初始化树
{
root.n = 1;
root.next[i] = NULL;
}
j = 0;
for(i = 0; i < n; i++)
{
if(s[i]==' ') //用空格隔开,取出每个单词
{
tree(st,j);
j = 0;
}
else
{
st[j] = s[i];
j++;
}
}
/*if(s[n-1]!=' ')
{
tree(st,j);
}*/
tree(st,j);
printf("%d\n",sum);
}
return 0;
}