题目链接:http://hihocoder.com/problemset/problem/1014
题意:给一些字符串作为字典,再给一些前缀问前缀为这个的有多少个单词。
思路:Trie树模板。
建立的思想不难,用指针指向下一个字符。因为字符长度不定,而且如果是26字母的话就会过长,所以用指针来做最好。那么问题来了。
首先声明一个Trie的时候必须要把他里面标记置为0,把所有指向儿子的Trie指针置为NULL。插入时,使用指针*p指向插入字符串的首地址a,方便接下来开辟空间;用*cur=root来把cur指向root,方便往下遍历。如果当前son为NULL,使用cur->son[*p-’a’] = new Trie进行动态分配。查询同。
源码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int const MAXNODE = 26;
struct Trie
{
int val;
Trie *son[MAXNODE];
Trie(){
val = 0;
for(int i=0; i<MAXNODE; i++)
son[i] = NULL;
}
};
void insert(Trie *root,char *a)
{
if(root == NULL || *a=='\0')
return;
Trie *cur = root;
char *p = a;
for(int i=0; i<strlen(a); i++){
if(cur->son[*p-'a']==NULL)
cur->son[*p-'a'] = new Trie;
cur = cur->son[*p-'a'];
cur->val++;
p++;
}
}
int query(Trie *root,char *a)
{
if(root==NULL || *a=='\0')
return 0;
Trie *cur = root;
char *p = a;
for(int i=0; i<strlen(a); i++){
if(cur->son[*p-'a'] == NULL)
return 0;
cur = cur->son[*p-'a'];
p++;
}
return cur->val;
}
int main()
{
int n,i;
char a[20];
scanf("%d",&n);
Trie *root = new Trie;
while(n--){
scanf("%s",a);
insert(root, a);
}
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%s",a);
// getchar();
printf("%d\n",query(root,a));
}
delete root;
return 0;
}