hdu 2072 单词数

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;

}



 

你可能感兴趣的:(HDU)