SDUT1500Message Flood(字典树)

题目链接

结题报告:

模板题。

我用的动态分配内存。。每一组数据操作完都要释放内存。。否则的话。会Memory Limit Exceeded的。

#include <stdio.h>
#include <stdlib.h>

#define MAXN 26

typedef struct TrieNode{
    int flag;
    struct TrieNode *next[MAXN];
}TrieNode;

TrieNode *CreateTrieNode(){
    TrieNode *p;
    int i;
    p = (TrieNode *)malloc(sizeof(TrieNode));
    p->flag = 0;
    for(i=0; i<MAXN; i++) p->next[i] = NULL;
    return p;
}

void InsertTrie(TrieNode **T, char *s){
    TrieNode *p;

    if(!(p = (*T))) p = (*T) = CreateTrieNode();

    int i=0, k;
    for(i=0; s[i]; i++){
        if(s[i]>='A' && s[i] <= 'Z') k = s[i] -'A'; //大小写不敏感
        else k = s[i] - 'a';

        if(!p->next[k]) p->next[k] = CreateTrieNode();

        p = p->next[k];
    }
    p->flag = 1;
}

int SearchTrie(TrieNode *T, char *s){
    TrieNode *p;
    if(!(p = T)) return 0;

    int i, k;
    for(i=0; s[i]; i++){
        if(s[i] >= 'A' && s[i] <= 'Z') k = s[i] - 'A';
        else k = s[i] - 'a';

        if(!p->next[k]) return 0;

        p = p->next[k];
    }
    if(p->flag){p->flag = 0; return 1;}
    else return 0;
}

void ReleaseTrie(TrieNode *T){  //释放内存
    int i;
    for(i=0; i<MAXN; i++){
        if(T->next[i]) ReleaseTrie(T->next[i]);
        T->next[i] = NULL;
    }
    free(T);
}

int main(){
    TrieNode *T;
    int n, m, i, cnt;
    char s[20];
    while(scanf("%d", &n) == 1 && n != 0){
        scanf("%d", &m);
        cnt = 0; T = NULL;
        for(i=0; i<n; i++){
            scanf("%s", s);
            InsertTrie(&T, s);
            cnt++;
        }
        for(i=0; i<m; i++){
            scanf("%s", s);
            if(SearchTrie(T, s)) cnt--;
        }
        printf("%d\n", cnt);
        ReleaseTrie(T);
    }

    return 0;
}

 

posted on 2013-02-20 09:51  Still_Raining  阅读(229)  评论(0编辑  收藏  举报