hdu 2486 字典树

跟上一道题差不多,拆分单词,这里是不断把后缀加进字典树,

但要注意同一个字母的两个或两个以上相同前缀只能算一个,

所以在插入时要多传入一个参数记录传入字符串所属单词的编号

,如果某个节点上一次也是由这个单词产生的,则只记一次就好

View Code
#include<stdio.h>
#include<string.h>
#include<math.h>
class trie{
public:
int num;
int pre;
trie *child[26];
trie()
{
num=0;
pre=-1;
memset(child,0,sizeof(child));
}
}root;
void insert(char *s,int p)
{
class trie *cur=&root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int id=s[i]-'a';
if(!cur->child[id])
cur->child[id]=new trie;
cur=cur->child[id];
if(cur->pre!=p)
{
cur->pre=p;
cur->num++;
}
}
}
int find(char *s)
{
class trie *cur=&root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int id=s[i]-'a';
if(!cur->child[id]) return 0;
cur=cur->child[id];
}
return cur->num;
}
char s[50];
int main()
{
int n,m,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",s);
int len=strlen(s);
for(j=0;j<len;j++)
insert(s+j,i);
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%s",s);
printf("%d\n",find(s));
}
return 0;
}



posted @ 2011-12-01 22:12  Because Of You  Views(326)  Comments(0Edit  收藏  举报