POJ

来源:互联网 发布:论坛软件下载 编辑:程序博客网 时间:2024/06/06 09:38
题目大意:

就是给你n个(1000000)字符串,这些字符串一共最多m(10000)种,一个字符串最长30个字符。问你每种字符串占总数的百分比。

注:这个有点坑的地方就是,字符串除了大小写字母,还好有多未知的字符,所有字典树数组开成了270就过了,之前开的100大小就过不去。

#include<iostream>#include<stdio.h>#include<string.h>#define M 10500using namespace std;int num[M]={0};char str[M][35]={0};struct trie{int id;trie *next[270];trie(){id=0;for(int i=0;i<270;i++){next[i]=NULL;}}};trie root;int n=0;int m=1;void trie_add(char *c){trie *p=&root;for(int i=0;i<strlen(c);i++){int t;t=(int)c[i];if((*p).next[t]==NULL){(*p).next[t]=new trie;}p=(*p).next[t];}if((*p).id==0){(*p).id=m;for(int i=0;i<strlen(c);i++){str[m][i]=c[i];}m++;}num[(*p).id]++;}void ceshi(){for(int i=0;i<m;i++){cout<<num[i]<<" ";}}void dfs(trie *p){if((*p).id!=0){printf("%s ",str[(*p).id]);double l;l=(double)num[(*p).id]/(double)n*100;printf("%.4lf\n",l);}for(int i=0;i<270;i++){if((*p).next[i]==NULL)continue;dfs((*p).next[i]);}} int main(){char l[35]={0};while(cin.getline(l,30)){n++;trie_add(l);memset(l,0,sizeof(l));}//ceshi();//cout<<endl<<n<<endl;trie *p=&root;dfs(p);}


另外还有遍历过程中,输出字符串的问题,我是用一个另外的字符串数组在建立trie树的时候就存下了所有的id对应的字符串,其实应该是可以在遍历的时候,记录下各个节点表示的字符从而达到输出目的的,这样其实可以更省空间。

0 0