字典树 配题 (HDU 1277)

字典树,通过数据结构的定义,来形成搜索树,方便查找。

有两个操作步骤:

  • 插入序列
  • 寻找序列

配题: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;
}
发布了331 篇原创文章 · 获赞 135 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/Triple_WDF/article/details/101474973