字典树,通过数据结构的定义,来形成搜索树,方便查找。
有两个操作步骤:
- 插入序列
- 寻找序列
配题:HDU 1277
这个题目应该是key的长度是小于5的数据。
思想:用关键词建立字典树,在每一个序列最后标记其编号,最后遍历整个文章,遇到编号输出即可,重复不需要输出。
// HDU 1277
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxN = 60005;
const int maxM = 10005;
int M, N;
char paper[maxN];
int res[maxM];
bool vis_res[maxM];
int index;
struct NODE
{
struct NODE* next_node[11];
int key_id;
NODE()
{
key_id = 0;
for (int i = 0; i < 10; i++)
{
next_node[i] = NULL;
}
}
};
void add_trie(NODE* root, char key[], int id)
{
int len = strlen(key);
struct NODE* cur_node = root;
for (int i = 0 ; i < len; i++)
{
int index = key[i] - '0';
if (cur_node->next_node[index] == NULL)
{
cur_node->next_node[index] = new NODE;
}
cur_node = cur_node->next_node[index];
}
cur_node->key_id = id;
}
void dfs(NODE* cur_node)
{
if (cur_node == NULL)
{
return;
}
for (int i = 0; i < 10; i++)
{
if (cur_node->next_node[i] != NULL)
{
cout<< i<< " key_id = "<< cur_node->next_node[i]->key_id<< endl;
dfs(cur_node->next_node[i]);
}
}
}
int main()
{
while (cin>> M>> N)
{
int cnt = 0;
index = 0;
struct NODE* root = new NODE;
memset(paper, '\0', sizeof(paper));
for (int i = 1; i <= M; i++)
{
char tmp[100];
cin>> tmp;
int len = strlen(tmp);
for (int j = 0; j < len; j++)
{
paper[index++] = tmp[j];
}
}
for (int i = 1; i <= N; i++)
{
char tmp1[10];
char tmp2[10];
char tmp3[10];
char key[100];
cin>> tmp1>> tmp2>> tmp3;
cin>> key;
add_trie(root, key, i);
}
for (int i = 0; i < index; i++)
{
struct NODE* cur_node = root;
for (int j = i; j < index; j++)
{
int index = paper[j] - '0';
if (cur_node->key_id != 0)
{
res[++cnt] = cur_node->key_id;
}
if (cur_node->next_node[index] == NULL)
{
break;
}
cur_node = cur_node->next_node[index];
}
}
if (cnt == 0)
{
cout<< "No key can be found !"<< endl;
}
else
{
memset(vis_res, false, sizeof(vis_res));
cout<< "Found key:";
for (int i = 1; i <= cnt; i++)
{
if (vis_res[res[i]] == false)
{
vis_res[res[i]] = true;
cout<< " [Key No. "<< res[i]<< "]";
}
}
cout<< endl;
}
}
return 0;
}