poj 2001 Shortest Prefixes(trie 트리)

2187 단어 Trie 트리
제목 링크: 클릭하여 링크 열기
사전 트리 템플릿 문제
노드에num을 추가하면 몇 개의 단어가 이 노드를 통과했는지 나타냅니다. 출력할 때num이 1이면 이 단어만 이곳을 통과할 수 있습니다break.
틀은 트리 - 해자 이 안에
코드에서 검색 함수 주석은 원 템플릿의 본제가 변경되었습니다
코드:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#define MAX 26
using namespace std;

typedef struct TrieNode                     //Trie    
{
    bool isStr;                            //            
    struct TrieNode *next[MAX];         //    
    int num;
}Trie;

void insert(Trie *root,const char *s)     //   s       
{
    if(root==NULL||*s=='\0')
        return;
    int i;
    Trie *p=root;
    while(*s!='\0')
    {
        if(p->next[*s-'a']==NULL)        //     ,     
        {
            Trie *temp=(Trie *)malloc(sizeof(Trie));
            for(i=0;i<MAX;i++)
            {
                temp->next[i]=NULL;
            }
            temp->num=0;
            temp->isStr=false;
            p->next[*s-'a']=temp;
            p=p->next[*s-'a'];
            p->num++;
        }
        else
        {
            p=p->next[*s-'a'];
            p->num++;
        }
        s++;
    }
    p->isStr=true;                       //                   
}

void search(Trie *root,const char *s)  //            
{
    Trie *p=root;
    while(p!=NULL)
    {
        p=p->next[*s-'a'];
        printf("%c",*s);
        if(p->num==1){ printf("
"); break; } s++; if(*s=='\0'){ printf("
"); break; } } } void del(Trie *root) // { int i; for(i=0;i<MAX;i++) { if(root->next[i]!=NULL) { del(root->next[i]); } } free(root); } int main(){ char t[1005][25]; Trie *root= (Trie*)malloc(sizeof(Trie)); for(int i=0;i<MAX;i++){ root->next[i]=NULL; } int len=1; while(~scanf("%s",t[len])){ insert(root,t[len++]); } for(int i=1;i<len;i++){ printf("%s ",t[i]); search(root,t[i]); } return 0; }

좋은 웹페이지 즐겨찾기