字典树
传送门
题目大意
给你很多个单词,要你统计单词出现的次数,最后按字典升序输出
思路
因为字典序的先序遍历是排序的,所以只需建好树后先序遍历一下树就可以满足题目要求的输出方式了。裸的Trie树,输出按字符串的字典序输出,所以插入的时候,把第一次出现的字符串暂时保存起来。以后排完序在查询输出即可
字典树代码
struct node{
int val;
int child[130];
node(){
val=0;
memset(child,0,sizeof child);
}
}tire[maxn];
int tot,cnt;
char str[50];
void insert(char *str){
int d,x=0;
for(int i=0;str[i];i++){
d=str[i];
if(!tire[x].child[d]){
tire[x].child[d]=++tot;
}
x=tire[x].child[d];
}
tire[x].val++;
}
void search(int u,int len,char *str){
for(int i=0;i<128;i++){
if(tire[u].child[i]){//存在
str[len]=i;
search(tire[u].child[i],len+1,str);
}
}
if(tire[u].val){
str[len]='\0';
printf("%s %.4f\n",str,tire[u].val*100.0/cnt);
}
}
int main(){
cnt=0;tot=0;
while(gets(str)!=NULL){
cnt++;//总数
insert(str);
}
search(0,0,str);
}
map代码
int main(){
string s;
int cnt=0;
map<string,int>mp;
while(getline(cin,s)){
mp[s]++;
cnt++;
}
map<string,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
cout<<it->first<<" ";
printf("%.4f\n",it->second*100.0/cnt);
}
}