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;
}
京公网安备 11010502036488号