a181. 逆逆向思考@Morris' Blog|PChome Online 人新台
2011-07-12 20:50:21| 人1,051| 回0 | 上一篇 | 下一篇

a181. 逆逆向思考

0 收藏 0 0 站台

a181. 逆逆向思考

容 :

Trie,又查找,是一形,是一哈希的。典型用是用於和排序大量的字元串(但不限於字元串),

所以常被搜索引擎系用於文本。它的是:最大限度地少的字元串比,查效率比哈希表高。

以上料引用自基百科

在想你模出一的 Trie

 

是一 Trie 的例子: Trie example.svg

在 Trie 中,保存了 A、to、tea、ted、ten、i、in、inn 8 字元串,用 8 位元(不包括用的空)。

怕有人因器, 排版掉

例出 :

 

 

入明 :

有多料,

第一行有一字 N, 代表有 N 字串

每字串度不超 100,0000 字元度 

所涵的字元 ASCII 33 ~ 127 (可示字元, 除了空白 32 外)

× 不 N 的, 是希望你用 linked list 做(用建 or 列, 也是OK)

× 不用心的(用做的)

× 得用free();

出明 :

於每一

整 Trie 出

按照 ASCII 由小排到大

情考例出

例入 :

8 A to tea ted ten i in inn 10 / /7 /? /7g G ( ({ (n /?J /)

例出 :

[ ][A] [i][n][n] [t][e][a] [d] [n] [o] [ ][(][n] [{] [/][)] [7][g] [?][J] [G]

提示 :

ZeroJudge 的 主, 果真是步了, 原本深度 10 就 stack overflow
每想到在出到 20 , 仍然不 overflow
所以在出到深度 100 , 你家的主, 也差不多 10 , 就吃 RE 了
那你要怎呢 ?

出 :

Trie (管理:morris1028)



作法 : Trie + 非的作

/**********************************************************************************/
/*  Problem: a181 "逆逆向思考" from Trie                                     */
/*  Language: C                                                                   */
/*nbsp; Result: AC (1780ms, 25368KB) on ZeroJudge                                     */
/*  Author: morris1028 at 2011-07-11 19:15:03                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
typedef struct TrieNode    {
    char c;
    struct TrieNode *kid, *peer;
}TrieNode;
typedef struct Trie    {
    struct TrieNode *root;
}Trie;
typedef struct Stack {
    struct Stack *prev;
    struct TrieNode *now, *curr;   
    int dv;
    char work;
}Stack;

void Trieinit(Trie*);
void InsTrie(Trie*, char s[]);
void TriePrint(TrieNode*, int);

void Trieinit(Trie *tree) {
    tree->root = (TrieNode*)malloc(sizeof(TrieNode));
    tree->root->c = ' ';
    tree->root->kid = tree->root->peer = NULL;
}
void TriePrint(TrieNode *now, int dv) {
    Stack *stack, *temp;
    stack = (Stack*)malloc(sizeof(Stack));
    stack->prev = NULL, stack->now = now, stack->dv = dv, stack->work = 0;
    int a;
    char flag = 0, flag2;
    while(stack != NULL) {
        if(stack->work == 0) {           
            if(flag == 1) {
                for(a = 0, flag = 0; a < stack->dv; a++)
                    printf("   ");
            }
            stack->curr = stack->now->kid, stack->work = 1;
            printf("[%c]", stack->now->c);

        }           
        flag2 = 0;
        while(stack->curr != NULL) {
            temp = (Stack*)malloc(sizeof(Stack));
            temp->now = stack->curr, temp->prev = stack, temp->dv = stack->dv+1;
            temp->work = 0;
            stack->curr = stack->curr->peer;
            stack = temp, flag2 = 1;
            break;
        }
        if(flag2) continue;
        if(stack->now->kid == NULL)    flag = 1, puts("");
        temp = stack->prev, free(stack->now), free(stack), stack = temp;
    }
}
void InsTrie(Trie *tree, char s[]) {
    TrieNode *curr = tree->root, *prev = NULL, *temp, *p;
    int a;
    for(a = 0; s[a]; a++) {
        p = curr, curr = p->kid, prev = NULL;
        while(curr != NULL && curr->c < s[a]) {
            prev = curr, curr = curr->peer;
        }
       
        if(curr == NULL) {
            temp = (TrieNode*)malloc(sizeof(TrieNode));
            temp->c = s[a], temp->kid = temp->peer = NULL;
            if(prev == NULL)    p->kid = temp;
            else    prev->peer = temp;
            curr = temp;
        }
        else {
            if(curr->c == s[a])    {continue;}
            temp = (TrieNode*)malloc(sizeof(TrieNode));
            temp->c = s[a], temp->kid = NULL;
            if(curr == p->kid)    p->kid = temp, temp->peer = curr;
            else    prev->peer = temp,    temp->peer = curr;
            curr = temp;
        }
    }
}

main() {
    int N;
    char s[1000001];
    while(scanf("%d", &N) == 1) {
        Trie Tree;
        Trieinit(&Tree);
        getchar();
        while(N--)
            gets(s), InsTrie(&Tree, s);
        TriePrint(Tree.root, 0);
    }
    return 0;
}

台: Morris
人(1,051) | 回(0)| 推 (0)| 收藏 (0)|
全站分: 不分 | 人分: ZeroJudge |
此分下一篇:d919. 最大面
此分上一篇:a175. 撒旦玩不玩骰子? (AVLTree 版本)

是 (若未登入"人新台"看不到回覆唷!)
* 入:
入片中算式的果(可能0) 
(有*必填)
TOP
全文
ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86