杭电 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; } }