传说中的字典树
#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; }
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|
公告
决定从线程开始!!
常用链接
留言簿(6)
随笔档案
搜索
最新评论
阅读排行榜
评论排行榜
|
|