hdu1800 Flying to the Mars--字典树

来源:互联网 发布:淘宝整点秒杀 编辑:程序博客网 时间:2024/06/05 03:31

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1800


题意:n个人,每个人一个数字,数字长度最长是30位,也就是必须得用字符串存,现在每人要学习骑扫帚去打仗,数字大的可以做数字小的师傅,这样他们可以用一个扫帚。问最后最少需要多少扫帚?


分析:坑点:一个人的数字可能是01,001,那这样的数据其实都是1,所以需要处理下。


#define _CRT_SECURE_NO_DEPRECATE #include<iostream>#include<vector>#include<cstring>#include<queue>#include<stack>#include<algorithm>#include<cmath>#define INF 99999999#define eps 0.0001using namespace std;int n;int ans;char s[50];struct Node{Node * next[10];int c;Node(){c = 0;for (int i = 0; i <= 9; i++)next[i] = nullptr;}}*pRoot;void add(char * p){int len = strlen(p);Node * pt = pRoot;for (int i = 0; i < len; i++){if (!pt->next[p[i] - '0'])pt->next[p[i] - '0'] = new Node;pt = pt->next[p[i] - '0'];}pt->c++;if (pt->c > ans)ans = pt->c;}void del(Node * p){for (int i = 0; i < 10; i++)if (p->next[i])del(p->next[i]);delete p;}int main(){while (~scanf("%d", &n)){pRoot = new Node;ans = 0;for (int i = 0; i < n; i++){scanf("%s", s);char * p = s;while (*p == '0')//去0p++;add(p);}printf("%d\n", ans);del(pRoot);}return 0;}




1 0
原创粉丝点击