【hdu1251-统计难题】Trie

时间:2023-03-09 14:26:26
【hdu1251-统计难题】Trie

http://acm.hust.edu.cn/vjudge/problem/16379

题意:给定多个单词,多次询问符合某前缀的单词有多少个。

题解:tire。数组开了5*10^6才A,不然就RE。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std; char s[];
int num;
struct node{
int son[];
int cnt;
}a[]; void clear(int x)
{
a[x].cnt=;
memset(a[x].son,,sizeof(a[x].son));
} void trie(char *c)
{
int l=strlen(c);
int x=;
for(int i=;i<l;i++)
{
int t=c[i]-'a'+;
if(!a[x].son[t])
{
num++;
clear(num);
a[x].son[t]=num;
}
x=a[x].son[t];
a[x].cnt++;
}
} int find(char *c)
{
int l=strlen(c);
int x=;
for(int i=;i<l;i++)
{
int t=c[i]-'a'+;
if(!a[x].son[t]) return ;
else x=a[x].son[t];
}
return a[x].cnt;
} int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
num=;
clear();
while()
{
// scanf("%s",s);
gets(s);
if(strlen(s)==) break;
trie(s);
}
while(scanf("%s",s)!=EOF)
{
printf("%d\n",find(s));
}
return ;
}