HDU 1251(字典树改造)

十分无耻的题目 开了300W的内存才过,这个测试数据也太变态了吧~~~

 

把原先用以比较结束的布尔值进行了替换,加入num值表示是进行了多少次前缀匹配,只要通过查找,返回匹配数就行了~~~上次的模版的某些部分有问题,重新进行了修正...

 

 

#include < iostream >
#include 
< queue >
using   namespace  std;
struct  node
{
    
long  num;
    
int  next[ 26 ];
    
void  init(){memset(next, - 1 , sizeof (next));num = 0 ;}
}s[
3000000 ];

int  p;
char  a[ 100 ];

inline 
void  preprocess(){s[p = 0 ].init();}

inline 
void  insert()
{
    
int  index = 0 ;
    
++ s[index].num;
    
for ( int  i = 0 ;a[i] != ' \0 ' ;i ++ )
    {
        
int  x = a[i] - ' a ' ;
        
if (s[index].next[x] ==- 1 )
        {
            s[
++ p].init();
            s[index].next[x]
= p;
        }
        index
= s[index].next[x];
        s[index].num
++ ;
    }
}

inline 
long  ct()
{
    
long  index = 0 ;
    
long  i;

    
for  (i = 0 ;a[i] != ' \0 ' ; ++ i)
    {
        
long  x = a[i] - ' a ' ;
        
if  (s[index].next[x] ==- 1 return   0 ;
        index
= s[index].next[x];
    }

    
return  s[index].num;
}


int  main()
{
    preprocess();

    
while  (gets(a))
    {

        
if (a[ 0 ] == ' \0 ' )
        {
            
break ;
        }    

        insert();
    }

    
while (gets(a))
    {
        printf(
" %ld\n " ,ct());
    }

    
return   0 ;
}

你可能感兴趣的:(HDU)