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;
}
#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;
}