题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4099

思想很容易想到

就是预处理出前10w个的fib数,然后建树查询

建树时只用前40位即可,所以在计算时只用截取前60位

但是我在截取时总是出错

后来看了别人的代码改了一下就对了

不过还是不知道为什么那样是对的

更改地方在代码:

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#define maxn 110
using namespace std;
char s[];
char c[];
char s1[maxn],s2[maxn],s3[maxn];
void add(char *s1,char *s2, char *s3)//大数加
{
int len1=strlen(s1)-;
int len2=strlen(s2)-;
int up=;
int x=,y=;
int k=;
int z=;
while(len1>= || len2>=)
{
if(len1<) x=;
else x=s1[len1]-'';
if(len2<) y=;
else y=s2[len2]-''; z=x+y+up; c[k++]=z%+'';
up=z/;
len1--;
len2--;
} if(up>) c[k++]=up+'';
for(int i=;i<k;i++)
s3[i]=c[k--i];
s3[k]='\0';
}
class node
{
public:
int ID;
node *next[]; };
node *root=new node;
void insert_node(char *s, int num)
{
node *p=root; for(int i=;s[i]&&i<;i++)
{
if(p->next[s[i]-'']==NULL)
{
node *temp=new node;
for(int j=;j<;j++)
temp->next[j]=NULL;
temp->ID=-;
p->next[s[i]-'']=temp; }
p=p->next[s[i]-'']; if(p->ID<) p->ID=num;
}
}
void init()
{
node *q=root;
for(int i=;i<;i++)
q->next[i]=NULL;
q->ID=-; s1[]='';s1[]='\0';
s2[]='';s2[]='\0'; insert_node(s1,);
insert_node(s2,); for(int i=;i<;i++)
{
int len1=strlen(s1);
int len2=strlen(s2);
if(len2>) // 防止进位出错,但是不知道为什么这样就可以防止了。。。。。
{
s2[len2-]='\0';
s1[len1-]='\0';
} //我自己曾经的方法
/*
if(len2>60) s2[len2-1]='\0';
if(len1>60) s1[len1-1]='\0'; */ add(s1,s2,s3);
insert_node(s3,i); strcpy(s1,s2);
strcpy(s2,s3); }
}
int find(char *s)
{
node* q=root;
int num;
int len=strlen(s);
for(int i=;i<len;i++)
{
int d=s[i]-''; if(q->next[d]==NULL) return -;
else
{
q=q->next[d];
num=q->ID;
}
}
return num;
}
void del_node(node *p)
{
for(int i=;i<;i++)
{
if(p->next[i]!=NULL)
del_node(p->next[i]); }
free(p); }
int main()
{
int t;
init(); scanf("%d",&t);
int iCase=;
while(t--)
{ scanf("%s",s);
printf("Case #%d: %d\n",++iCase,find(s));
}
del_node(root);
return ;
}

hdu4099 Revenge of Fibonacci 字典树的更多相关文章

  1. hdu 4099 Revenge of Fibonacci 字典树+大数

    将斐波那契的前100000个,每个的前40位都插入到字典树里(其他位数删掉),然后直接查询字典树就行. 此题坑点在于 1.字典树的深度不能太大,事实上,超过40在hdu就会MLE…… 2.若大数加法时 ...

  2. UVa 12333 Revenge of Fibonacci (字典树+大数)

    题意:给定一个长度小于40的序列,问你那是Fib数列的哪一项的前缀. 析:首先用大数把Fib数列的前100000-1项算出来,注意,一定不能是100000,要不然会WA的,然后每个数取前40位,不足4 ...

  3. HDU4099 Revenge of Fibonacci(高精度+Trie)

    Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/ ...

  4. hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法

    Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...

  5. hdu4099 Revenge of Fibonacci

    题意:给定fibonacci数列,输入前缀,求出下标.题目中fibonacci数量达到100000,而题目输入的前缀顶多为40位数字,这说明我们只需要精确计算fibinacci数前40位即可.查询时使 ...

  6. HDU 4099 Revenge of Fibonacci(高精度+字典树)

    题意:对给定前缀(长度不超过40),找到一个最小的n,使得Fibonacci(n)前缀与给定前缀相同,如果在[0,99999]内找不到解,输出-1. 思路:用高精度加法计算斐波那契数列,因为给定前缀长 ...

  7. UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树

    题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...

  8. UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 & 字典树)

    题意: 给定n个(n<=40)数字, 求100000个以内有没有前面n个数字符合给定的数字的fibonacci项, 如果有, 给出最小的fibonacci项, 如果没有, 输出-1. 分析: 可 ...

  9. UVA-12333 Revenge of Fibonacci(竖式加法模拟 & 字典树)

    题目: 给出一个斐波那契数字的前缀,问第一个有这个前缀的数字在斐波那契数列中是第几个. 思路: 紫书提示:本题有一定效率要求.如果高精度代码比较慢,可能会超时. 利用滚动数组和竖式加法来模拟斐波那契相 ...

随机推荐

  1. 【前端童鞋看过来!】给大家分享网盘里前端相关书籍,主要是和网络通信(HTTP/TCP/IP)及javascript相关的

    百度云链接:https://pan.baidu.com/s/1kUPdf5H(无密码) 截图: <HTTP权威指南> [豆瓣书评]:此书第一部分是HTTP的概略,如果你没有时间,通读第一部 ...

  2. jquery data属性的使用

    var func=function(){console.log("test")};$("div").data("test",func);$( ...

  3. RecyclerView中装饰者模式应用

    近段时间一直在加班,在赶一个项目,现在项目接近尾声,那么需要对过去一段时间工作内容进行复盘,总结下比较好的解决方案,积累一些经验,我认为的学习方式,是「理论-实践-总结-分享」,这一种很好的沉淀方式. ...

  4. C++ Primer 5 CH7 类

    7.1 定义抽象数据类型 定义和声明成员函数的方式与普通函数差不多,成员函数的声明必须在类的内部,定义可以在类的内部或外部.作为接口组成部分的非成员函数的声明和定义都在类的外部. 定义在类内部的函数是 ...

  5. SVG动画实践篇-模拟音量高低效果

    git 地址:https://github.com/rainnaZR/svg-animations/tree/master/src/demo/step2/volumn 说明 这个动画的效果就是多个线条 ...

  6. nosql使用感受

    最近一个项目尝试了使用ssdb(一个类似于redis的数据结构数据库),主要感受有几点: 优势 nosql的无模式在修改和插入时很方便,不需要预先新建表或者修改表结构来新加字段,只需要代码里面使用就行 ...

  7. Android5.0水波纹效果ripple实现

    1.如何设置波纹效果 // 波纹有边界 android:background="?android:attr/selectableItemBackground" // 波纹超出边界 ...

  8. ORACLE中关于外键缺少索引的探讨和总结

    在ORACLE数据库中,定义外键约束时,ORACLE是不会自动创建对应索引的,必须手动在外键约束相关的列上创建索引.那么外键字段上是否有必要创建索引呢?如果有必要的话,巡检时,如何找出外键字段上没有创 ...

  9. Weex的环境搭建以及集成到Android项目

    最近由于公司的需要,初步研究了Weex,Weex是阿里开发的一个web的框架,官方的介绍如下: Weex 是一套简单易用的跨平台开发方案,能以 web 的开发体验构建高性能.可扩展的 native 应 ...

  10. canvas画图

    这个元素负责在页面中设定一个区域,然后就可以通过JS动态的在这个区域中绘制图形. <canvas>由几组API构成. <canvas>还建议一个名为WebGL的3D上下文 (1 ...