hdu 3460 Ancient Printer 字典树

来源:互联网 发布:mac中的照片在哪里 编辑:程序博客网 时间:2024/05/22 12:14

这题的答案就是(节点数*2)+(n)-(最长串的长度)。

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3460

#include <stdio.h>#include <string.h>#include <stdlib.h>#define maxn 30struct Trie{    Trie * next[maxn];    int v;};Trie * root;int cnt;void Init_Trie(){    root = (Trie *)malloc(sizeof(Trie));    for(int i=0;i<maxn;i++){        root -> next[i] = NULL;    }}void Add_Trie(char * str){    Trie * p = root , * q;    for(int i=0;str[i]!='\0';i++){        int id = str[i] - 'a';        if(p->next[id]==NULL){            q = (Trie *)malloc(sizeof(Trie));            q -> v = 0;            for(int j=0;j<maxn;j++){                q -> next[j] = NULL;            }            p -> next[id] = q;            p = p -> next[id];        }        else {            //p -> next[id]->v++; //记录有某个共同前缀的单词数量            p = p -> next[id];        }    }    p -> v ++;//记录相同单词的数量}int Search_Trie(char * str){    Trie * p = root;    for(int i=0;str[i]!='\0';i++){        int id = str[i] - 'a';        p = p -> next[id];        if(p==NULL){            return 0;        }    }    return p -> v;//返回以搜索串为前缀的数量}void Del_Trie(Trie * p){    for(int i=0;i<maxn;i++){        if(p->next[i])Del_Trie(p->next[i]);    }    free(p);    cnt ++;}void Input(){    int n,maxlen;    while(~scanf("%d",&n)){        Init_Trie();        maxlen = -1;        char a[55];        for(int i=0;i<n;i++){           scanf("%s",a);           int templen = strlen(a);           if(templen>maxlen)maxlen = templen;           Add_Trie(a);         }        cnt = 0;        Del_Trie(root);        printf("%d\n",(cnt-1)*2+n-maxlen);    }}void File(){    freopen("a.in","r",stdin);    freopen("a.out","w",stdout);}int main(void){//    File();    Input();    return 0;}


0 0
原创粉丝点击