题目链接:点击打开链接
代码:
#include<iostream>
#include<cstring>
using namespace std;
struct T{
int num;
T* next[26];
//构造函数 初始化 后面定义的根节点 定以后直接就已经被初始化
T()
{
num=0;
for(int i=0;i<26;i++)
{
next[i]=NULL;
}
}
}r;
void insert(char s[])
{
T* p=&r;
int k=strlen(s);
for(int i=0;i<k;i++)
{
int a=s[i]-'a';
// 如果在当前位的下一个a位是空的 那么就再初始化一个
// 并把初始化得到的空位赋到a位置
if(p->next[a]==NULL)
{
p->next[a]=new T();
}
// 是空 说明后者字符串长度大于等于前者
// 不是空 说明继续往下走或后者长度小于后者
// 无论如何都得赋值 并且浏览数加一
p=p->next[a];
p->num++;
}
}
int find(char s[])
{
T* p=&r;
for(int i=0;i<strlen(s);i++)
{
int a=s[i]-'a';
// 如果在当前位的下一个a位是空的 说明不存在以此串开头的字符串
if(p->next[a]==NULL)
{
return 0;
}
p=p->next[a];
}
return p->num;
}
int main()
{
int n,m;
cin>>n;
while(n--)
{
char s[15];
cin>>s;
insert(s);
}
cin>>m;
while(m--)
{
char s[15];
cin>>s;
cout<<find(s)<<endl;
}
return 0;
}