您的位置:首页 > 其它

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

2012-03-29 21:11 597 查看
//字典树,找最短的唯一前缀,字典树抄的模版

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: