关闭

POJ 2001 字典树裸模版

407人阅读 评论(0) 收藏 举报
再做几个字典树就去AC自动机...... 加油!

用模板感觉不错啊!!细节细节!!

#include<iostream>
#include<string>
#include<cstdio>
#define MAX 26
using namespace std;

struct TireNode
{
       int nCount;
       TireNode *next[MAX];
};

TireNode Memeroy[1111111];
int allocp=0;

void InitTireRoot( TireNode **pRoot )
{
     *pRoot=NULL;
}

TireNode *CreateTire()
{
         int i,k;
         TireNode *p=&Memeroy[allocp++];
         p->nCount=1;
         for( i=0;i<MAX;i++ )
              p->next[i]=NULL;
         return p;
}

void InsertTire( TireNode **Root,char *s )
{
     int i=0,k;
     TireNode *p;
     if( !(p=*Root) )
         p=*Root=CreateTire();
     
     while( s[i] )
     {
            k=s[i++]-'a';
            if( p->next[k] )
                p->next[k]->nCount++;
            else
                p->next[k]=CreateTire();
            p=p->next[k]; 
     }
} 

void SearchTire( TireNode **Root,char *s )
{
    int i=0,k;
    TireNode *p=*Root;
    while( s[i] )
    {
           printf( "%c",s[i] );
           k=s[i++]-'a'; 
           if( p->next[k] && p->next[k]->nCount==1 )
               return ;
           p=p->next[k];
    }
}



int main()
{
    //freopen( "write.out","w",stdout );
    //freopen( "read.in","r",stdin );
    TireNode *Root;
    InitTireRoot(&Root); 
    int k=0;
    char s[1111][22];
    
    while( scanf("%s",s[k])!=EOF )
           InsertTire(&Root,s[k++]);
    
    for( int i=0;i<k;i++ )
    {
         printf( "%s ",s[i] );
         SearchTire(&Root,s[i]);
         printf( "\n" ); 
    }    
    return 0;
} 


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场