rt.
感激不尽!
我是用指针来做的。虽然常数大,但还是能勉强过的。(C语言返祖写法,不符合周礼)
但是就是不知道到底为什么WA了啊...
源代码:
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
struct Node
{
Node * next[64];
int down_cnt;
};
typedef Node * Trie,** pTrie;
inline int trans(char ch)
{
if(ch>='A' and ch<='Z')
return ch-'A';
if(ch>='a' and ch<='z')
return ch-'a'+26;
return ch-'0'+52;
}
inline Trie init_Trie(void)
{
return (Trie)calloc(1,sizeof(Node));
}
inline void add(const char * str,Trie trie)
{
Trie ptr=trie;
int len=strlen(str);
for(int i=0;i<=len;i++)//ptr 指向第 i 层
{
if(ptr->next[trans(str[i])]==nullptr)
{
ptr->next[trans(str[i])]=init_Trie();
}
ptr=ptr->next[trans(str[i])];
ptr->down_cnt++;
}
}
inline void search(const char str[],Trie trie)
{
int len=strlen(str);
Trie ptr=trie;
for(int i=0;i<len;i++)
{
ptr=ptr->next[trans(str[i])];
if(ptr==nullptr)
{
cout<<0<<endl;
return;
}
}
cout<<ptr->down_cnt<<endl;
}
void free_Trie(Trie trie)
{
if(trie==nullptr)
return;
for(int i=0;i<64;i++)
{
free_Trie(trie->next[i]);
}
free(trie);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
//freopen("P8306_1.in","r",stdin);
//freopen("aaa.out","w",stdout);
int t,n,q,cnt=0;
string str;
cin>>t;
while(t--)
{
Trie trie=init_Trie();
cin>>n>>q;
while(n--)
{
cin>>str;
add(str.c_str(),trie);
}
while(q--)
{
cnt++;
cin>>str;
search(str.c_str(),trie);
}
free_Trie(trie);
}
}