您的位置:首页 > 编程语言 > C语言/C++

hdu 2072 单词数

2013-09-13 09:28 267 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  杭电 ACM 字典树 C++