hdu 2072-单词数(字典树)

来源:互联网 发布:蓝月传奇10转生数据 编辑:程序博客网 时间:2024/06/05 07:50

address:http://acm.hdu.edu.cn/showproblem.php?pid=2072

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

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

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

Sample Input
you are my friend
#

Sample Output
4

题目做的很难受,本来 好简单 用string类型传参前注意到 字符串末尾不处理的话 最后一个单词 就不会录入做判断 ,所以在原字符串后加’ ’ ,所以多扫描一位
各种改 交了10几次 都是错的 不得不用 char类型字符串每次更改末尾了 但我觉得 我对string类型的 处理没错 , 错误代码 贴到第二个 希望某位大佬能指出错误
string 类型的 错误已经找到了 是最后数组没清零 清一下 就好 ,分析就不删了 当反思

正确代码

#include <iostream>#include <bits/stdc++.h>using namespace std;const int maxn = 1e6+10;int sum;struct node{    int t;    node * child[26];    node()    {        t = 0;        for (int i=0; i<26; i++)        {            child[i] = NULL;        }    }};node *root;int flag;void build(char* a){    //cout<<a<<endl;    node *p;    node * newnode;    int i;    p = root;    for (i=0; i<strlen(a); i++)    {        int m = a[i]-'a';        if (p->child[m]==NULL)        {            newnode = new node;            p->child[m] = newnode;        }        p = p->child[m];    }    if (p->t==0)    {        sum++;        p->t=1;    }}void ended(node *head)   //删除字典树{    for (int i=0; i<26; i++)    {        if (head->child[i]!=NULL)            ended(head->child[i]);    }    delete head;}int main(){    char s[maxn];    char s2[maxn];    while (gets(s) && strcmp(s, "#"))    {        root  = new node;        int i, j, top = 0;        sum= 0;        for (i = 0; i <= strlen(s); i++)        {            if (s[i] >= 'a' && s[i] <= 'z')            s2[top++] = s[i];            else            {                if (top != 0)                {s2[top] = '\0';                top = 0;                build(s2);}            }        }        printf("%d\n", sum);    }    return 0;}

用 string 存储

#include <iostream>#include <bits/stdc++.h>using namespace std;const int maxn = 1e6+10;int sum;struct node{    int t;    node * child[26];    node()    {        t = 0;        for (int i=0; i<26; i++)        {            child[i] = NULL;        }    }};node *root;int flag;void build(string a){    //cout<<a<<"@"<<endl;    node *p;    node * newnode;    int i;    p = root;    for (i=0; i<a.length(); i++)    {        int m = a[i]-'a';        if (p->child[m]==NULL)        {            newnode = new node;            p->child[m] = newnode;        }        p = p->child[m];    }    if (p->t==0)    {        sum++;        p->t=1;    }}void ended(node *head)   //删除字典树{    for (int i=0; i<26; i++)    {        if (head->child[i]!=NULL)            ended(head->child[i]);    }    delete head;}int main(){    char a[maxn];    sum=0;    while (gets(a)&& strcmp(a, "#"))    {        sum=0;        root = new node;        string gd="";        //cout<<strlen(a)<<endl;        a[strlen(a)]=' ';        for (int i=0; i<strlen(a); i++)        {            //cout<<a[i]<<"!!!!!"<<endl;            if (a[i]>='a'&&a[i]<='z')                gd += a[i];            else if (gd!="")            {                build(gd);                gd = "";            }        }        cout<<sum<<endl;        //getchar();        ended(root);        memset(a,0,sizeof(a));    }    return 0;}
原创粉丝点击