杭电 HOJ 1251 统计难题 解题报告

    初看以为很简单的。。。当然,直接数组保存单词然后遍历查询一定会超时。在网上搜索了一下,看到“字典树”的概念。自己也没看他的代码,但是却找到了方法了。

    字母一共有26个。建立一个结构,里面保存一个大小为26的指针数组,然后读入单词,节点+1。额,看代码更清楚些

#include <iostream>

#include <string>

using namespace std;



class word

{

public:

    word()

    {

        memset(s,0,sizeof(s));

        num=0;

    }

    word *s[26];

    int num;

};



int main()

{

    int i,len,t;

    char str[100];

    word *head,*p;

    head=new word;

    while(cin.getline(str,sizeof(str)) && str[0]!='\0')

    {

        p=head;

        len=strlen(str);

        for(i=0;i<len;i++)

        {

            t=str[i]-'a';

            if(p->s[t]==0)

                p->s[t]=new word;

            p=p->s[t];

            p->num++;

        }

    }

    while(cin>>str)

    {

        p=head;

        len=strlen(str);

        for(i=0;i<len;i++)

        {

            t=str[i]-'a';

            if(p->s[t]==0)

            {

                i=-1;

                break;

            }

            p=p->s[t];

        }

        if(i==-1)

            cout<<0<<endl;

        else

            cout<<p->num<<endl;

    }

}

 

你可能感兴趣的:(杭电)