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;
}


目录
相关文章
|
8月前
|
Java
hdu 2503 a/b + c/d
hdu 2503 a/b + c/d
27 0
|
人工智能
|
机器学习/深度学习
hdu 2604 Queuing
点击打开hdu 2604 思路: 递推+矩阵快速幂 分析; 1 根据题目的意思,我们可以求出F[0] = 0 , F[1] = 2 , F[2] = 4 , F[3] = 6 , F[4] = 9 , F[5] = 15 2 那么根据上面...
784 0
|
人工智能
HDU1106
为了给学弟学妹讲课,我又水了一题…… 1: import java.util.*; 2: import java.io.*; 3: 4: public class HDU1106 5: { 6: public static void main...
862 0
|
存储
hdu 2795 Billboard
点击打开hdu 2795 思路: 线段树+单点更新 分析: 1 题目的意思是给定一个h*w的广告牌h为高,w为宽,现在有n个高为1宽为wi的小广告要放上去,原则是最先放最上面和最左边的位置 2 题目的h和w的最大值为10^9,但是n最大为200000。
752 0
hdu 1869 六度分离
点击打开链接hdu 1869 思路:最短路+floyd 分析: 1 题目是要求所有的数据能否满足“六度分离”,那么我们就想到所有点之间的最短距离。
824 0
|
算法 BI 人工智能
hdu 1217 Arbitrage
点击打开链接hdu 1217 思路:最短路变形题(floyd 或 SPFA) 分析: 2 题目要求的是经过一轮的转换之后,原来的比例能够大于1。
888 0