传说中的字典树
#include <stdio.h>
#include 
<string.h>
#include 
"stdlib.h"

char in[35];

typedef struct
{
    
int next[53];
    
int count;
}
node;
node trie[
150005];
int now;

char st[10005][35];
int snow;

void init()
{
    
    memset(
&trie[0],0,sizeof(trie));
    now 
= 1;
    snow 
= -1;
}


int cmp(const void *a, const void *b)
{

    
return strcmp((char *)a, (char *)b);
}


int insert(char *str, int len)
{
    
int i;
    
int p = 0
    
int hash;
    
for (i=0; i<len; i++)
    
{
        hash 
= str[i]-20;
        
if (!trie[p].next[hash])
        
{
            memset(
&trie[now], 0, sizeof(node));
            trie[p].next[hash] 
= now++;
        }

        p 
= trie[p].next[hash];
    }

    trie[p].count
++;
    
return p;
}


int search(char *str, int len)
{
    
int i;
    
int p = 0
    
int hash;
    
for (i=0; i<len; i++)
    
{
        hash 
= str[i]-20;
        
if (!trie[p].next[hash])
        
{
            
return 0;
        }

        p 
= trie[p].next[hash];
    }

    
if(!trie[p].count)
    
{
        
return 0;
    }

    
return p;
}


int main()
{

    
int p, i;
    
int count = 0;
    
int len;
    init();
    
while (gets(in))
    
{
        len 
= strlen(in);
        p 
= search(in, len);
        
if (!p)
        
{
            insert(in, len);
            strcpy(st[
++snow], in);
        }

        
else
        
{
            trie[p].count 
++;
        }

        count 
++;
    }


    qsort(st, snow
+1, sizeof(st[0]), cmp);
    
for (i=0; i<snow+1; i++)
    
{
        printf(
"%s"&st[i]);
        len 
= strlen(st[i]);
        printf(
" %.4lf\n", (double)trie[search(st[i], len)].count/(double)count*100);
    }

    
return 0;
}