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

POJ-2001-Shortest Prefixes http://poj.org/problem?id=2001 找出能唯一标示一个字符串的最短前缀,如果找不出,就输出该字符串 用字典树即可 ...
  • Cambridgeacm
  • Cambridgeacm
  • 2012年07月16日 22:09
  • 3575

poj2001Shortest Prefixes【字典树找最短唯一前缀】

Language: Default Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K To...
  • R1986799047
  • R1986799047
  • 2015年11月23日 16:12
  • 461

poj 2001 Shortest Prefixes(Tire树/字典树)

poj 2001 Shortest Prefixes(Tire树/字典树)
  • PKU_ZZY
  • PKU_ZZY
  • 2016年11月23日 14:07
  • 190

POJ 2001:Shortest Prefixes

A prefix of a string is a substring starting at the beginning of the given string. The prefixes of "...
  • qq_28954601
  • qq_28954601
  • 2016年04月29日 21:45
  • 325

poj 2001 Shortest Prefixes 字典树

点击打开链接题目链接
  • qq_16843991
  • qq_16843991
  • 2014年08月06日 20:22
  • 340

POJ 2001:Shortest Prefixes(字典树)

Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7290 ...
  • wugj03
  • wugj03
  • 2011年08月28日 10:09
  • 344

POJ 2001 Shortest Prefixes(字典树)

POJ 2001 Shortest Prefixes(字典树)
  • queuelovestack
  • queuelovestack
  • 2015年10月06日 17:56
  • 321

poj 2001 Shortest Prefixes(字典树 )

Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14619   Accepte...
  • lh__huahuan
  • lh__huahuan
  • 2015年04月17日 20:42
  • 444

POJ 2001 Shortest Prefixes(字典树)

题目链接:Shortest Prefixes 题意:n个字符串,求每个字符串的最短非公共前缀,若没有输出其本身 思路:利用字典树记录每个前缀使用的次数,以前标记作用的fla...
  • u013497151
  • u013497151
  • 2014年07月31日 15:36
  • 756

POJ 2001 : Shortest Prefixes (字典树)

题意 : 给你一些字符串,让你为每个字符串找一个最短的前缀,来唯一标识这个字符串,与其他字符串区别开来.这个标志串不能是其他字符串的前缀,除非这个标志串等于这个字符串本身. 考虑用字典树来做.标志当前...
  • pku_Coder
  • pku_Coder
  • 2016年12月21日 00:04
  • 203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2001 Shortest Prefixes 字典树(模版题)
举报原因:
原因补充:

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