hdu4099(Trie)

题意:

  给定一个长度不超过40的数字串s,求斐波那契数列的前十万项中,最小的一个前缀为s的数的下标。

解决:

  高精度算出前十万个斐波那契数,每个取前40位,建trie,查询O(40)

  1 #include <bits/stdc++.h>
  2
  3 int a[22000], b[22000], c[22000];
  4 int l1, l2, l3;
  5 int op[55], len;
  6
  7 struct Node{
  8     Node *ch[10];
  9     int ans;
 10     Node()
 11     {
 12         for (int i = 0; i < 10; ++i)
 13             ch[i] = NULL;
 14         ans = -1;
 15     }
 16 };
 17
 18 struct Trie{
 19     Node *root;
 20     void init()
 21     {
 22         root = new Node();
 23     }
 24     void trieInsert(int index)
 25     {
 26         Node *p = root;
 27         for (int i = l3; i >= std::max(l3-39, 1); --i) {
 28             if ( p -> ch[c[i]] == NULL) {
 29                 p -> ch[c[i]] = new Node();
 30                 p-> ch[c[i]] -> ans = index;
 31             }
 32             p = p ->ch[c[i]];
 33         }
 34         p -> ans = index;
 35     }
 36     int trieQuery()
 37     {
 38         Node *p = root;
 39         for (int i = 1; i <= len; ++i) {
 40             if ( p -> ch[op[i]] == NULL)
 41                 return -1;
 42             p = p -> ch[op[i]];
 43         }
 44         return p -> ans;
 45     }
 46 }tr;
 47
 48 void add()
 49 {
 50     int carry = 0;
 51     for (int i = 1; i <= std::max(l1, l2); ++i) {
 52         c[i] = a[i] + b[i] + carry;
 53         if (c[i] >= 10) {
 54             carry = 1;
 55             c[i] -= 10;
 56         }
 57         else
 58             carry = 0;
 59     }
 60     if (carry == 1) {
 61         c[++l3] = 1;
 62     }
 63 }
 64
 65 void init()
 66 {
 67     tr.init();
 68     memset(a, 0, sizeof a);
 69     memset(b, 0, sizeof b);
 70     memset(c, 0, sizeof c);
 71     a[++l1] = 1;
 72     b[++l2] = 1;
 73     c[++l3] = 1;
 74     tr.trieInsert(0);
 75     for (int i = 2; i < 100000; ++i) {
 76         add();
 77         tr.trieInsert(i);
 78         for (int j = 1; j <= l2; ++j) {
 79             a[j] = b[j];
 80         }
 81         for (int j = 1; j <= l3; ++j) {
 82             b[j] = c[j];
 83         }
 84         l1 = l2;
 85         l2 = l3;
 86     }
 87 }
 88
 89 char buf[55];
 90
 91 int main()
 92 {
 93     init();
 94     int T;
 95     scanf("%d", &T);
 96     for (int t = 1; t <= T; ++t) {
 97         scanf("%s", buf+1);
 98         len = strlen(buf+1);
 99         for (int i = 1; i <= len; ++i) {
100             op[i] = buf[i] - ‘0‘;
101         }
102         printf("Case #%d: %d\n", t, tr.trieQuery());
103     }
104 }
时间: 2024-10-29 19:08:47

hdu4099(Trie)的相关文章

HDU4099 Revenge of Fibonacci(高精度+Trie)

Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/Others) Total Submission(s): 2582    Accepted Submission(s): 647 Problem Description The well-known Fibonacci sequence is defined as following: Here w

HDU 1075 What Are You Talking About (Trie树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 map可以过...我上的字典树,小bug有点尴尬,题目没有明确给出数据范围也是无奈. 贡献了几次RE 一次WA.尴尬.discuss里面有个说注意前缀的到是给了点tip.总体来说不错 代码: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <functional> 3 #include <algorithm> 4 #include <

POJ2778 DNA Sequence Trie+矩阵乘法

题意:给定N个有A C G T组成的字符串,求长度为L的仅由A C G T组成的字符串中有多少个是不含给定的N个字符串的题解: 首先我们把所有的模式串(给定的DNA序列)建Trie,假定我们有一个匹配串,并且在匹配过程到S[i]这个字符时匹配到了Trie上的某个节点t,那么有两种可能: 匹配失败:t->child[S[i]]为空,跳转到t->fail,因此t->fail一定不能是某个模式串的结尾: 匹配成功:跳转到t->child[S[i+1]],因此t->child[S[i

poj3630 Phone List (trie树模板题)

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26328   Accepted: 7938 Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogu

从Trie谈到AC自动机

ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验. Trie Trie是一种好玩的数据结构.它的每个结点存的是字母,因此得名`字母树`. 出一张图让大家感受下. (image powered by SaiBu NaoCu) 上面那是一棵插入了 ape,app,applicant,application,bake,ban,banana 等词的Trie.红色结点表示接受态. 显然,查找时只需顺着链照下来,插入只需

【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y): l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).r = max ( ((x+lastans) mod N)+1 , ((y+last

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

Trie树学习2

数组实现的Trie树 字符容量有限,可以使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib> #