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]==-1return 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;
}
posted @ 2008-08-05 20:03  Hdu-Lost  阅读(413)  评论(1编辑  收藏  举报