题目大意:
就是给你n个(1000000)字符串,这些字符串一共最多m(10000)种,一个字符串最长30个字符。问你每种字符串占总数的百分比。
注:这个有点坑的地方就是,字符串除了大小写字母,还好有多未知的字符,所有字典树数组开成了270就过了,之前开的100大小就过不去。
#include<iostream>
#include<stdio.h>
#include<string.h>
#define M 10500
using 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对应的字符串,其实应该是可以在遍历的时候,记录下各个节点表示的字符从而达到输出目的的,这样其实可以更省空间。