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;
}
#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;
}
相关文章推荐
- 字典树---2001 POJ Shortest Prefixes(找最短前缀)
- POJ2001 - Shortest Prefixes - 字典树
- 字典树---2001 POJ Shortest Prefixes(找最短前缀)
- POJ 2001 Shortest Prefixes 【 trie树(别名字典树)】
- poj 2001 Shortest Prefixes 【字典树】【找每一个字符串在字符串集里面的 最短且可唯一标识 的前缀】
- POJ 2001 Shortest Prefixes 字典树经典题,求最短唯一前缀)
- poj 2001 Shortest Prefixes 字典树的输出问题的解释~~ 2012-4-14
- POJ【2001】Shortest Prefixes----字典树
- 【POJ 2001 Shortest Prefixes】+ 字典树
- POJ 2001 Shortest Prefixes 【 trie树(别名字典树)】
- POJ 2001 Shortest Prefixes 字典树Trie
- poj 2001 Shortest Prefixes 字典树
- Shortest Prefixes POJ - 2001(字典树)
- POJ 2001 Shortest Prefixes【字典树】
- POJ 2001-Shortest Prefixes【字典树】
- [复习][poj2001]字典树(trie树)Shortest Prefixes
- poj 2001 Shortest Prefixes 字典树
- [字典树] poj 2001 Shortest Prefixes
- POJ 2001 Shortest Prefixes【字典树】
- Shortest Prefixes POJ - 2001 (字典树模板题~)