Trie树即字典树。是把多个串中的字母逐个插入到一开始只有根结点的树上二构成的树。Trie树的边表示的是模式串中的字母,从根结点走到任意节点经过的路径称为路径字符串。从根结点到叶子节点的路径字符串即为一个原来建树的模式串。Trie在解决涉及串的前缀时特别方便。
我的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstring>
using namespace std;
struct Node
{
Node * child[26];
Node *prev;
int count;
Node()
{
memset(child, 0, sizeof(child));
count = 0;
prev = NULL;
}
};
Node Tree[1000000]; //静态申请空间。
int nodeCount;
void insertNode(Node *tree, char *s)
{
int i;
Node * p = tree;
for(i = 0; s[i]; i++)
{
if(p->child[s[i]-'a'] == 0)
{
p->child[s[i]-'a'] = tree + nodeCount; //将各个节点按次序分配到数组的相应位置。
nodeCount++;
}
p = p->child[s[i]-'a'];
p->count++; //经过该节点,统计次数加一。
}
}
int search(Node *tree, char * s)
{
int i;
Node *p = tree;
for(i = 0; s[i]; i++) //循环走的最后个节点。
{
p = p->child[s[i]-'a'];
if(!p)
{
return 0;
}
}
return p->count; //最后个节点出现的次数即该串出现的次数。
}
int main()
{
int n, m, i, j;
scanf("%d", &n);
char s[12];
nodeCount = 1;
for(i = 0; i < n; i++)
{
scanf(" %s", s);
insertNode(Tree+1, s);
}
scanf("%d", &m);
for(i = 0; i < m; i++)
{
scanf(" %s", s);
printf("%d\n", search(Tree+1, s));
}
return 0;
}