hdu 1277 全文检索

简介: 点击打开链接hdu 1277 思路:AC自动机模板题 分析: 1 只要把输入处理成一个字符串,然后对关键字建立trie树和求next 2 注意题目是说按照匹配到的顺序输出,所以这个地方注意一下。

点击打开链接hdu 1277


思路:AC自动机模板题
分析:
1 只要把输入处理成一个字符串,然后对关键字建立trie树和求next
2 注意题目是说按照匹配到的顺序输出,所以这个地方注意一下。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

#define MAXN 600010
#define MAX 10010
#define N 15

int n , m , cnt;
char text[MAXN];
struct Node{
   Node *next;
   Node *child[N];
   int number;
};
Node node[MAXN];
Node *root;
queue<Node*>q;

Node* newNode(){
   node[cnt].next = NULL;
   node[cnt].number = 0;
   for(int i = 0 ; i < N ; i++)
      node[cnt].child[i] = NULL;
   return &node[cnt++];
}

void insert(char *str , int x){
  int len = strlen(str);
  Node *p = root;

  for(int i = 0 ; i < len ; i++){
     int num = str[i]-'0';
     if(p->child[num] == NULL)
       p->child[num] = newNode();
     p = p->child[num];
  }
  p->number = x;
}

void getNext(){
   while(!q.empty())
       q.pop();

   q.push(root);
   root->next = NULL;

   while(!q.empty()){
      Node *p = q.front();
      q.pop();
      for(int i = 0 ; i < N ; i++){
         if(p->child[i]){
           q.push(p->child[i]);
           Node *tmp = p->next;

           while(tmp){
              if(tmp->child[i]){
                p->child[i]->next = tmp->child[i];
                break;
              }
              tmp = tmp->next;
           }
           if(tmp == NULL)
             p->child[i]->next = root;
         }
      }
   }
}

bool find(){
    int len = strlen(text);
    bool mark = false;
    Node *p = root;

    for(int i = 0 ; i < len ; i++){
       int num = text[i]-'0';
       while(p->child[num] == NULL && p != root)
           p = p->next;
       if(p->child[num]){
         p = p->child[num];
         Node *tmp = p;
         while(tmp){
            if(tmp->number){
              if(!mark){
                printf("Found key:");
                mark = true;
              }
              printf(" [Key No. %d]" , tmp->number);
            }
            tmp = tmp->next;
         }
       }
    }
    return mark;
}

int main(){
   char str[MAXN];
   while(scanf("%d%d%*c" , &n , &m) != EOF){
      cnt = 0;
      root = newNode();
      
      for(int i = 0 ; i < n ; i++){
         gets(str);
         strcat(text , str);
      }

      int len = strlen(text);
      text[len] = '\0';
      gets(str);/*读掉空行*/

      for(int i = 0 ; i < m ; i++){
         gets(str);
         for(int j = 1 ; j < n ; j++){
            if(str[j] == ' ' && str[j-1] == ']'){
              insert(str+j+1 , i+1);
              break;
            }
         }
      }
      getNext();
      if(!find())
        printf("No key can be found !");
      printf("\n");
   }
   return 0;
}



目录
相关文章
|
9天前
|
人工智能 运维 安全
|
7天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
684 23
|
8天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
14天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
1120 110
|
人工智能 数据可视化 数据挖掘
Quick BI 体验&征文有奖!
瓴羊生态推出Quick BI 征文激励计划,鼓励用户分享数据分析实践经验与技术洞察,征集高质量原创文章。内容围绕AI功能体验与BI案例实践,设季奖、年奖及参与奖,优秀作者可获现金奖励、产品内测资格及官方认证形象。投稿截止至2026年3月31日。
Quick BI 体验&征文有奖!