字典树 ,map 容器 hdu 1251

来源:互联网 发布:校园女生暴力数据 编辑:程序博客网 时间:2024/06/06 01:22

统计难题

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 20471    Accepted Submission(s): 8907


Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 

Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
 

Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 

Sample Input
bananabandbeeabsoluteacmbabbandabc
 

Sample Output
2310
 

Author
Ignatius.L

//考查知识点:map容器 #include<stdio.h>#include<string.h>#include<string>#include<map>using namespace std;int main(){char s[12];char a[12];map<string,int>m;while(gets(s)){int len=strlen(s);if(!len)break;int i;for(i=len;i>=1;--i){s[i]='\0';m[s]++;}}while(gets(a)){printf("%d\n",m[a]);}return 0;} 
法二:字典树 模板 
//考查知识点:字典树 我终于也要努力了 ,加油 要真正的做自己。。。#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;typedef struct s{struct s *child[28];int n;}node,*Node;Node root;void insert(char *s){Node current=NULL;Node newnode=NULL;current=root;int len=strlen(s),i,j,now;for(i=0;i<len;++i){now=s[i]-'a';if(current->child[now]!=NULL){current=current->child[now];(current->n)++;}else{newnode=(Node )calloc(1,sizeof(node));//没有改字母 先声明一个 内存空间  current->child[now]=newnode;//将此空间的首席之分配给该字母 current=newnode;// current->n=1;}}}int find(char *s){int i,j,len=strlen(s),now;Node current=NULL;//初始化 current=root;for(i=0;i<len;++i){now=s[i]-'a';if(current->child[now]!=NULL)//该遍历的字符串存在对应的那个字母 {current=current->child[now];}else//不匹配直接退出  return 0;}return current->n;}int main(){char a[100010],temp[100010];root=(Node)calloc(1,sizeof(node));while(gets(a),strcmp(a,"")){insert(a);}while(gets(temp)){printf("%d\n",find(temp));}return 0;} 



0 0
原创粉丝点击