題目鏈接:點擊打開鏈接
代碼:
#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;
}