题意:求输入每种字符串出现数量的百分比;
解法:建字典树对每个字符串进行插入统计,输出时dfs遍历字典树并用一个char ss[]数组记录遍历时的字符串。
代码:
/****************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
using namespace std;
#define eps 1e-8
typedef long long LL;
int count1=1;
struct point
{
int son[256];
double num;
} points[310000];
double sum=0;
void insert(char * s,int p)
{
int len=strlen(s);
for(int i=0;i<len;i++)
{//cout<<s[i]<<endl;
int tool=s[i];
if(points[p].son[tool]!=0){
p=points[p].son[tool];
}
else
{
points[p].son[tool]=count1++;
p=count1-1;
}
}
points[p].num++;
}
char ss[100];
void print(int p,int len)
{
if(points[p].num>=eps)
printf("%s %.4f\n",ss,100*points[p].num/sum);
for(int i=0;i<256;i++)
{
if(points[p].son[i]!=0)
{
ss[len]=i;
print(points[p].son[i],len+1);
ss[len]='\0';
}
}
}
char s[100];
int main()
{
//freopen ("in.txt" , "r" , stdin);
while(gets(s)){
insert(s,0);sum++;
}
print(0,0);
return 0;
}