HDU1251统计难题 trie树

来源:互联网 发布:阿里云数据同步 编辑:程序博客网 时间:2024/06/12 19:57

Description

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

Input

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

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

Output

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

题意就是。。。喵的中文题目好吧

trie树的模版题,建一个保存指针的数组。每次存储访问节点次数即可

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<iostream>#include<vector>#include<string>using namespace std;typedef long long ll;#define N 505const int inf=0x3f3f3f3f;struct node{int num;node* next[26];node(){num=0;memset(next,NULL,sizeof(next));}};node *root=new node();node *pos;void build(string s){pos=root;for(int i=0;i<s.size();i++){int index=s[i]-'a';if(pos->next[index]==NULL){pos->next[index]= new node();pos=pos->next[index];pos->num++;}else{pos=pos->next[index];pos->num++;}}}int query(string s){pos=root;for(int i=0;i<s.size();i++){int index=s[i]-'a';if(pos->next[index]==NULL) return 0;pos=pos->next[index];}return pos->num;}int main(){int T;string s;while(getline(cin,s)&&s[0]!='\0'){//printf("fuck\n");build(s);}while(cin>>s){printf("%d\n",query(s));}return 0;}


0 0
原创粉丝点击