题意:给你一些单词,再给你一些前缀,输出对应的给定的单词是这些前缀的个数。
思路:把这些单词建立一个字典树,走过一个节点对应的计数器就垒加,再分别找前缀发现没有走过的节点就直接输出0,如果没输出0就输出对应节点的记数变量就OK了。
#include<cstdio>
#include<cstring>
struct Node
{
int s[26];
int index;
void init()
{
memset(s,-1,sizeof(s));
index=0;
}
}f[1000000];
int cnt=1;
void work(char m[])
{
int len=strlen(m);
int p=0;
for(int i=0;i<len;i++)
{
if(f[p].s[m[i]-'a']==-1)
{
f[p].s[m[i]-'a']=cnt;
cnt++;
f[cnt-1].init();
}
p=f[p].s[m[i]-'a'];
f[p].index++;
}
}
int find(char m[])
{
int len=strlen(m);
int p=0;
for(int i=0;i<len;i++)
{
p=f[p].s[m[i]-'a'];
if(p==-1)
return 0;
}
return f[p].index;
}
int main()
{
char m[18];
f[0].init();
while(gets(m)!=NULL&&strlen(m))
work(m);
while(gets(m)!=NULL)
printf("%d\n",find(m));
return 0;
}