题意:
给出p个字符串作为,求接下来给出的q个查询有多少是p中字符串的子串
一般字典树求的是前缀,这个要求子串,所以说建立字典树的时候,如ads,不仅仅插入ads,还要插入ds,s
//统计是字典里多少单词的子串
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node{
int id;
int cnt;
node *next[26];
}*root;
node *build()
{
node *p=(node*)malloc(sizeof(node));
for(int i=0;i<26;i++)
p->next[i]=NULL;
p->cnt=1;
return p;
}
void insert(char *mer,int id)
{
node *p;
p=root;
int len=strlen(mer);
for(int i=0;i<len;i++)
{
if(p->next[mer[i]-'a']==NULL)
{
p->next[mer[i]-'a']=build();
p->next[mer[i]-'a']->id=id;//打上id标记
}
p=p->next[mer[i]-'a'];
if(p->id!=id)//如果标记不相等,说明不属于同一个字符串了
{
p->id=id;//用当前id覆盖前一个
p->cnt++;//累加
}
}
}
int query(char *str)
{
node *p;
p=root;
int ans=0;
int len=strlen(str);
for(int i=0;i<len;i++)
{
if(!(p->next[str[i]-'a']))
return 0;
ans=p->next[str[i]-'a']->cnt;
p=p->next[str[i]-'a'];
}
return ans;
}
int main()
{
int P,Q;
char mer[25],str[25];
root=build();
scanf("%d",&P);
while(P--)
{
scanf("%s",mer);
int len=strlen(mer);
for(int i=0;i<len;i++)//建立字典树,依次插入
{
insert(mer+i,P+1);//第一个参数是后缀字符串,第二个是标识
}
}
scanf("%d",&Q);
while(Q--)
{
scanf("%s",str);
printf("%d\n",query(str));
}
return 0;
}