HDU 4099 字典树+高精度

题意:给出某项斐波那契数的前几位,让输出最小的一项前缀为这个串的项数。

先高精度算出前100000项斐波那契的前50位。并把前40位存进字典树预处理一下。字典树节点值存为第几项。然后输入字符串直接查找。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 50
int fib[3][N+1];
class trie
{
public:
    trie* next[10];
    int value;
    trie()
    {
        for(int i=0; i<10; i++)
            next[i]=0;
        value=-1;
    }
} root,*a;
void insert(trie* p,int* s,int n,int len)
{
    p=&root;
    int k=len;
    while(k>=0&&len-k<=40)
    {
        if(!p->next[s[k]])
            p->next[s[k]]=new trie;
        p=p->next[s[k]];
        if(p->value==-1)
            p->value=n;
        k--;
    }
}
int find(trie* p,char* s)
{
    p=&root;
    int k=0,ans;
    while(s[k]!='\0')
    {
        if(!p->next[s[k]-'0'])
            return -1;
        p=p->next[s[k]-'0'];
        k++;
    }
    return p->value;
}
void init()
{
    memset(fib,0,sizeof(fib));
    char str[45];
    fib[0][0]=1;
    fib[1][0]=1;
    insert(a,fib[0],0,0);
    int i,j;
    for(i=2; i<100000; i++)
    {
        int c=0;
        for(j=0; j<=N; j++)
        {
            fib[2][j]=(c+fib[1][j]+fib[0][j])%10;
            c=(c+fib[1][j]+fib[0][j])/10;
        }
        if(j==N+1&&c>0)
        {
            for(int t=0; t<N; t++)
            {
                fib[0][t]=fib[1][t+1];
                fib[1][t]=fib[2][t+1];
            }
            fib[0][N]=0;
            fib[1][N]=c;
        }
        else
        {
            for(int t=0; t<=N; t++)
            {
                fib[0][t]=fib[1][t];
                fib[1][t]=fib[2][t];
            }
        }
        int t;
        for(t=N; t>=0; t--)
            if(fib[1][t]) break;
        insert(a,fib[1],i,t);
    }
}
int main()
{
    init();
    char temp[45];
    int t,ca=0;
    scanf("%d",&t);
    while(t--)
        scanf("%s",temp),
        printf("Case #%d: %d\n",++ca,find(a,temp));
    return 0;
}
时间: 2024-08-03 22:57:38

HDU 4099 字典树+高精度的相关文章

算法题:HDU 3724 Encoded Barcodes(字典树,计算前缀数)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=3724 题目: Encoded Barcodes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1022    Accepted Submission (s): 337 Problem Description All the big mall

算法题:HDU 2846 Repository(字典树,计数)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目: Repository Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1657    Accepted Submission (s): 605 Problem Description When you go shopping,

算法题:HDU 1251 统计难题(字典树,统计前缀个数)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 题目 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组 成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的 前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师 交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提

算法题:HDU 1075 What Are You Talking About(字典树学习题)

链表: http://acm.hdu.edu.cn/showproblem.php?pid=1075 题目: What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K (Java/Others) Total Submission(s): 7939    Accepted Submission(s): 2470 Problem Description Ign

算法题:HDU 1247 Hat’s Words(字典树)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1247 题目大意: 按照字典序给出多个单词,  可以发现里面有些单词是由字典中其它的两个单词组成的.按顺 序输出所有符合这个条件的单词. 分析与总结: 用字典树存下所有的单词,然后对所有单词一一枚举, 对每个单词, 又进行"拆分", 拆分可能有多种情况,所以枚举单词拆分的中点,在字典序中查找拆分后的两部分是否存在,存在即输 出. 代码: #include<iostream> #in

HDOJ/HDU 1251 统计难题(字典树啥的~Map水过)

Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提

字典树概述

字典树简介 字典树(Trie Tree),又称单词查找树,是键树的一种,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 字典树有3个基本性质: 1.根节点不包含字符,其余的每个节点都包含一个字符: 2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: 3.每个节点的所有子节点包含的字符都不相同. 字典树的结构一般如下图所示: 以字符串为例,我们可以将其存储结构写成如下形式: #define MAX 26 //字符集的大

从Trie树(字典树)谈到后缀树(10.28修订)

作者:July.yansha. 出处:http://blog.csdn.net/v_JULY_v .  引言     常关注本blog的读者朋友想必看过此篇文章:从B树.B+树.B*树谈到R 树,这次,咱们来讲另外两种树:Tire树与后缀树.不过,在此之前,先来看两个问题.     第一个问题: 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析.     之前在此文:海量数据处理面试题集锦与Bit-map详解中给出的参考答案:用trie

HDU1075 字典树

我用字典树写的 按照题意做就行 #include<iostream> #include<cstring> #include<cstdio> using namespace std; class trie { public: trie* next[26]; char str_temp[12]; int num; //记录前缀的个数 bool value; //标记这里是不是一个单词 trie() { for(int i=0; i<26; i++) next[i]=0