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(竖式加法模拟 & 字典树)
题目: 给出一个斐波那契数字的前缀,问第一个有这个前缀的数字在斐波那契数列中是第几个. 思路: 紫书提示:本题有一定效率要求.如果高精度代码比较慢,可能会超时. 利用滚动数组和竖式加法来模拟斐波那契相 ...
随机推荐
- UIImageView帧动画相关属性和方法
@property(nonatomic,copy) NSArray *animationImages; 需要播放的序列帧图片数组(里面都是UIImage对象,会按顺序显示里面的图片) @propert ...
- NGUI 解决UILable 在空行起始位置加‘\n’
NGUI 解决UILable 默认在顶满第一行时,在起始位置如键入空格无效,其原因就是会加入换行符,使字符串,整体换行了 解决办法加入bool变量控制 1在 UILable代码中添加 [HideInI ...
- css基本布局
一.一列布局 关键代码: { width:960; margin:0 auto: } 代码: 运行结果: 分析:以上代码实现一列布局,头部占整个浏览器 ...
- Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)
(一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...
- MaterialDrawer开源侧滑菜单的使用手册
官方有详细说明,但是我首次查找的时候并没有第一眼就能使用全部功能,而网上也查找了一下,几乎所有的博客都是简简单单的几句代码...连句说明都没有,可能是我这小菜鸡理解能力不行,或者大神们认为coding ...
- Letter Combinations of a Phone Number:深度优先和广度优先两种解法
Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...
- EDP转接IC NCS8805:RGB/LVDS转EDP芯片,带Scaler
RGB/LVDS-to-eDP Converter w/ Scaler1 FeaturesEmbedded-DisplayPort (eDP) Output1/2/4-lane eDP @ 1.62/ ...
- [Linux] PHP程序员玩转Linux系列-Linux和Windows安装nginx
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- Script error.全面解析
一些用户向我们反馈,Fundebug的[JavaScript](https://docs.fundebug.com/notifier/javascript/)监控插件抓到了很多**Script err ...
- Hadoop之RPC简单使用(远程过程调用协议)
一.RPC概述 RPC是指远程过程调用,也就是说两台不同的服务器(不受操作系统限制),一个应用部署在Linux-A上,一个应用部署在Windows-B或Linux-B上,若A想要调用B上的某个方法me ...