1.用字典树实现
空间超额(MLE)的代码,还有更好更紧凑的字典树实现方法
#include<bits/stdc++.h> using namespace std; struct Trie{ //字典树的定义 Trie* next[26]; int num; //以当前字符串为前缀的单词的数量 Trie(){ //构建函数 for(int i=0;i<26;i++) next[i]=NULL; num=0; } }; Trie root; void Insert(char str[]){ //将字符插入字典树中 Trie *p=&root; for(int i=0;str[i];i++){ //遍历每一个字符 if(p->next[str[i]-'a']==NULL) //如果该字符没有对应的结点 p->next[str[i]-'a']=new Trie; //创建一个 p=p->next[str[i]-'a']; p->num++; //(保证输入的每个单词都不一样) } } int Find(char str[]){ //返回以字符串为前缀的单词的数量 Trie* p=&root; for(int i=0;str[i];i++){ //在字典树中找到该单词的结尾位置 if(p->next[str[i]-'a']==NULL) return 0; p=p->next[str[i]-'a']; } return p->num; } int main(){ char str[11]; while(gets(str)){ if(!strlen(str)) break; //输入了一个空行 Insert(str); } while(gets(str)) cout<<Find(str)<<endl; return 0; }
2.用map实现
这一题用map来做非常简单,代码如下:
#include<bits/stdc++.h> using namespace std; int main(){ char str[10]; map<string,int>m; while(gets(str)){ int len=strlen(str); if(!len) break; for(int i=len;i>0;i--){ str[i]='\0'; m[str]++; } } while(gets(str)) cout<<m[str]<<endl; return 0; }