hdu4099 Revenge of Fibonacci 字典树
题目链接: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 字典树的更多相关文章
- hdu 4099 Revenge of Fibonacci 字典树+大数
将斐波那契的前100000个,每个的前40位都插入到字典树里(其他位数删掉),然后直接查询字典树就行. 此题坑点在于 1.字典树的深度不能太大,事实上,超过40在hdu就会MLE…… 2.若大数加法时 ...
- UVa 12333 Revenge of Fibonacci (字典树+大数)
题意:给定一个长度小于40的序列,问你那是Fib数列的哪一项的前缀. 析:首先用大数把Fib数列的前100000-1项算出来,注意,一定不能是100000,要不然会WA的,然后每个数取前40位,不足4 ...
- HDU4099 Revenge of Fibonacci(高精度+Trie)
Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 204800/204800 K (Java/ ...
- hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法
Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...
- hdu4099 Revenge of Fibonacci
题意:给定fibonacci数列,输入前缀,求出下标.题目中fibonacci数量达到100000,而题目输入的前缀顶多为40位数字,这说明我们只需要精确计算fibinacci数前40位即可.查询时使 ...
- HDU 4099 Revenge of Fibonacci(高精度+字典树)
题意:对给定前缀(长度不超过40),找到一个最小的n,使得Fibonacci(n)前缀与给定前缀相同,如果在[0,99999]内找不到解,输出-1. 思路:用高精度加法计算斐波那契数列,因为给定前缀长 ...
- UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树
题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...
- UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 & 字典树)
题意: 给定n个(n<=40)数字, 求100000个以内有没有前面n个数字符合给定的数字的fibonacci项, 如果有, 给出最小的fibonacci项, 如果没有, 输出-1. 分析: 可 ...
- UVA-12333 Revenge of Fibonacci(竖式加法模拟 & 字典树)
题目: 给出一个斐波那契数字的前缀,问第一个有这个前缀的数字在斐波那契数列中是第几个. 思路: 紫书提示:本题有一定效率要求.如果高精度代码比较慢,可能会超时. 利用滚动数组和竖式加法来模拟斐波那契相 ...
随机推荐
- vuejs学习笔记(2)--属性,事件绑定,ajax
属性 v-for 类似于angular中的 ng-repeat ,用于重复生成html片段: <ul id="box"> <li v-for="(v, ...
- coolpad 5879logcat不能输入日志解决办法
有几天没完手机了,玩一下,发现不能打印日志了,记得最开始的时候 会弹出一个选项选择是否输出日志,在网上找了好的方法. 1.重启adb,点击DBMS 进行刷新. 2重启eclipse. 3.重装驱动. ...
- 取消putty右键粘贴功能
还是非常喜欢putty的.就是右键默认的粘贴功能比较讨人厌.
- Nodejs安装后修改全局路径配置
--以Windows平台为例,类Unix平台操作方式相同 1. 新建保存node_modules的文件夹,例如我的路径为:D:\NodeJS Lib\npm 2. 在DOS窗口输入以下代码,把缓存及储 ...
- Redis基础学习(二)—数据类型
一.Redis支持的数据类型 Redis中存储数据是通过key-value存储的,对于value的类型有以下几种: (1)字符串. (2)Map (3)List (4)Set public cla ...
- 08 Noise and Error
噪声:误标.对同一数据点的标注不一致.数据点信息不准确... 噪声是针对整个输入空间的. 存在噪声的情况下,VC bound依旧有用: 存在噪声,就是f--->p(y|x),f是p的特殊情况:如 ...
- AngularJS学习笔记5
11.AngularJS HTML DOM ng-disabled 指令直接绑定应用程序数据到 HTML 的 disabled 属性. <button ng-disabled="my ...
- ArrayList和List主要区别 就是ArrayList类型不安全。
什么是不安全? 1:List大家都知道初始化的时候需要定义其类型,例如 List<int> listTest = new List<int>():而ArrayList,例如:A ...
- T-SQL几个简单的操作
视图 咱们先来了解下视图到底是什么意思,顾名思义,用简单的视觉方式展现复杂的内容 有什么功能呢, 各位应该还记得咱们之前练习的那个小小的数据库superise,里面有这么四张表,分别是: studen ...
- SQL基础函数
首先咱们一起来看一下SQL的基本函数 一.聚合函数 二.数学函数 三.字符串函数 四.转换函数 五.时间函数 这样子看起来可能很多,那咱们给变得---------------------------- ...