poj 2001 Shortest Prefixes 字典树(模版题)

原创 2012年03月29日 21:11:43

//字典树,找最短的唯一前缀,字典树抄的模版

#include <cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define  MAX    26
char str[1005][25];
typedef struct TrieNode{
    int nCount;
    struct TrieNode *next[MAX];
}TrieNode;

TrieNode Memory[1000000];
int allocp = 0;

void InitTrieRoot(TrieNode **pRoot){
    *pRoot = NULL;
}

TrieNode *CreateTrieNode(){
    int i;
    TrieNode *p;
    p = &Memory[allocp++];
    p->nCount = 1;
    for(i = 0 ; i < MAX ; i++){
        p->next[i] = NULL;
    }
    return p;
}

void InsertTrie(TrieNode **pRoot , char *s){
    int i , k;
    TrieNode *p;
    if(!(p = *pRoot))
        p = *pRoot = CreateTrieNode();
    i = 0;
    while(s[i]){
        k = s[i++] - 'a'; //确定branch
        if(p->next[k])
            p->next[k]->nCount++;
        else
            p->next[k] = CreateTrieNode();
        p = p->next[k];
    }
}

int SearchTrie(TrieNode **pRoot , char *s){
    TrieNode *p;
    int i , k;
    if(!(p = *pRoot))
        return 0;
    i = 0;
    while(s[i]){
        k = s[i++] - 'a';
        if(p->next[k] == NULL)    return 0;
        p = p->next[k];
    }
    return p->nCount;
}

int main(){
 //freopen("1.txt", "r", stdin);
    char s[25];
    int cnt=0, i, len, j;
    TrieNode *Root = NULL;
    InitTrieRoot(&Root);
    while(scanf("%s", str[cnt++])!=EOF){
        InsertTrie(&Root , str[cnt-1]);
    }
    cnt--;          //cnt多加了次1
    for(i=0; i<cnt; i++){
        printf("%s ", str[i]);
  len=strlen(str[i]);
  for(j=len; j>=1; j--){
   strncpy(s, str[i], j);
   s[j]='\0';
   if(SearchTrie(&Root , s)>1){
                strncpy(s, str[i], j+1);
                s[j+1]='\0';
    printf("%s\n", s);
    break;
   }
  }
  if(j==0)printf("%c\n", str[i][0]);      //特殊处理
    }
    return 0;
}

POJ 2001 Shortest Prefixes 字典树经典题,求最短唯一前缀)

Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18950...

POJ 2001-Shortest Prefixes【字典树】

Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16880...

POJ 2001 Shortest Prefixes (字典树,简单)

给你一堆字符串,让你输出每个字符串着这些字符串中可以单独识别的前缀。因为是直接找的字典树的题目来做,所i就是用字典树了。 字典树的每一个结点记录某一个字符出现的次数,之后,遍历每一个字符串,当出现第...

POJ 2001 Shortest Prefixes (字典树 TRIE)

给你一些单词,让你求出他们最短的前缀,当然,这个前缀不能有歧义,例如给出单词 carton cart car carton的 前缀 就不能是cart,因为cart的前缀是cart,同理cart的前缀...

POJ 2001 Shortest Prefixes 字典树

题意很好理解就不说了,然后这道题其实不用字典树更简单,但是为了练习trie树就写了一下,1A了哈哈,再对比了一下讨论区的大神代码,发现我还是写复杂了。。。 思路: 想到利用字典树,继承字典树原有机...

poj2001Shortest Prefixes(字典树)

Description A prefix of a string is a substring starting at the beginning of the given string. Th...

POJ 2001 Shortest Prefixes(字典树入门)

题目: http://poj.org/problem?id=2001 题意: 找到多个字符串中,

poj 2001 Shortest Prefixes 【字典树】【找每一个字符串在字符串集里面的 最短且可唯一标识 的前缀】

Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14747...

POJ_2001_Shortest Prefixes(字典树)

题意:求给出的每个单词的“标志前缀”,即此前缀只能在此单词中有,而其他单词不拥有,所以叫做标志前缀。...

Shortest Prefixes (POJ_2001) 字典树

Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16582   Accepte...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2001 Shortest Prefixes 字典树(模版题)
举报原因:
原因补充:

(最多只允许输入30个字)