hdu 3724 Encoded Barcodes

简介: 点击打开链接hdu 3742 思路:字典树 分析: 1 题目给定n个单词,有m次的询问。每一次的询问会有k个长度为8的条形码,条形码是8个double组成。

点击打开链接hdu 3742


思路:字典树

分析:
1 题目给定n个单词,有m次的询问。每一次的询问会有k个长度为8的条形码,条形码是8个double组成。现在要求将条形码转化为字符串然后求出n个单词中以该字符串为前缀的个数,最后把m次询问结果相加。
2 利用字典树在节点里面存储以某一个子串为前缀的单词的个数;接下来就是怎样把条形码转化为字符串,由于题目明确指出只有两种的宽度,并且有两倍的关系。但是由于存在误差,所以输入的数据是有差的;其实我们只要求出8个数的总和然后求平均值,那么肯定就有比平均值小的肯定用0表示,比平均值大的肯定用1表示,为什么呢(因为误差的范围只在(0.95-1.05))。所以这样就可以解决问题。

代码:

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

#define eps 1e-9 
#define MAXN 1000010
#define MAX 40
#define N 30

int cnt , n , m , k;
int ans;
struct Trie{
   int count;
   Trie *child[N];
}trie[MAXN];
Trie *root;

/*节点的空间分配*/
Trie *newTrie(){
   trie[cnt].count = 0;
   for(int i = 0 ; i < N ; i++)
      trie[cnt].child[i] = NULL;
   return &trie[cnt++];
}

/*字典树的插入*/
void insert(char *str){
   Trie *s = root;
   int len = strlen(str);
   for(int i = 0 ; i < len ; i++){
      int num = str[i]-'a';
      if(s->child[num] == NULL)
        s->child[num] = newTrie();
      s = s->child[num];
      s->count++;
   }
}

/*字典树的查找*/
int search(char *str){
   Trie *s = root;
   int len = strlen(str);
   for(int i = 0 ; i < len ; i++){
      int num = str[i]-'a';
      if(s->child[num] == NULL)
        return 0;
      s = s->child[num];
   }
   return s->count;
}

int main(){
   int i , j;
   char words[MAX];
   double num[8];
   double sum;
   int number;
   while(scanf("%d%d" , &n , &m) != EOF){
       ans = 0;
       cnt = 0;
       root = newTrie();
       /*输入单词*/
       for(i = 0 ; i < n ; i++){
          scanf("%s" , words);
          insert(words);
       }
       /*输入m次的询问*/
       for(i = 0 ; i < m ; i++){
          scanf("%d" , &k);
          memset(words , '\0' , sizeof(words));
          for(j = 0 ; j < k ; j++){
             sum = 0.0;
             for(int t = 0 ; t < 8 ; t++){
                scanf("%lf" , &num[t]);
                sum += num[t];
             }
             /*求要搜素的字符串*/
             sum /= 8;
             number = 0;
             for(int t = 0 ; t < 8 ; t++){
                 if(num[t]-sum > eps)
                   number += pow(2.0 , 7-t);
             }
             char c = number;
             words[j] = c;
          }
          ans += search(words);/*相加*/
       }
       printf("%lld\n" , ans);
   }
   return 0;
}


目录
相关文章
|
存储 Kubernetes 监控
Kubecost | Kubernetes 开支监控和管理 🤑🤑🤑
Kubecost | Kubernetes 开支监控和管理 🤑🤑🤑
|
存储 缓存 前端开发
浏览器缓存读取规则
浏览器缓存读取规则是指浏览器如何存储和检索网页资源以提高加载速度和减少服务器负载。这些规则包括缓存策略、过期时间及验证机制,确保用户获取最新且高效的内容。
|
存储 监控 安全
邮件告警通知
【10月更文挑战第20天】
|
域名解析 网络协议 网络安全
当您的域名解析的邮件服务器无法发送邮件时,可以检查以下几个方面
当您的域名解析的邮件服务器无法发送邮件时,可以检查以下几个方面
825 1
|
人工智能 自然语言处理 安全
Gemini 人工智能:谷歌AI重磅来袭!好消息,国内可用
Gemini 是 Google 🧠 开发的革命性人工智能模型,旨在打造一个功能强大的多模态 AI 系统。
|
人工智能 搜索推荐
AI技术在医疗领域的革命性应用
本文将探讨人工智能(AI)在医疗领域的应用,包括诊断、治疗和预防等方面。我们将看到AI如何帮助医生更准确地诊断疾病,提供个性化的治疗方案,以及预测疾病的发生。同时,我们也将讨论AI在医疗领域的挑战和未来的发展。
240 28
|
人工智能 供应链 数据挖掘
跨境电商目前现状
2024年,跨境电商市场持续增长,全球市场规模预计达2.1万亿美元,中国跨境电商进出口额达1.22万亿元。行业竞争加剧,技术创新和政策支持成为重要推动力。市场多元化趋势明显,新兴市场增长迅速,销售渠道多样化,但海外政策调整带来一定挑战。
|
机器学习/深度学习 数据采集 人工智能
机器学习在医疗诊断中的应用:开启智慧医疗新时代
【8月更文挑战第5天】机器学习革新医疗诊断,提升精准度与效率。通过分析医学影像和基因数据,实现疾病早期检测与个性化治疗。在药物研发中,加速候选药物筛选与优化过程。智能化患者管理及智能辅助决策系统进一步增强医疗服务质量。面对数据质量和隐私保护挑战,持续技术创新推动智慧医疗发展。
|
传感器 人工智能 算法
逐渐走向实用,揭秘世界顶尖人形机器人ASIMO
从《列子·汤问》传说中以假乱真的舞者到现在科幻作品中的各种类人机器人,人类从没停止过对创造类人机器的幻想。而随着机器人学、人工智能和计算科学等科学技术的发展,人类长久以来的梦想正在逐渐成为现实,我们的生活中也渐渐开始有了它们的身影。
1589 0
逐渐走向实用,揭秘世界顶尖人形机器人ASIMO
|
JSON C# 数据格式
【氚云】基于Python的WebService与氚云系统集成
基于Python的WebService与氚云系统集成
721 0