传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4099

这个题目就是一个坑或。

题意:给你不超过40的一串数字,问你这串数字是Fibonacci多少的开头几位数字,如果不存在则输出-1.

题解:明明说好的不超过40,但是在建字典数的时候不加i<41就超内存了,杭电你是想咋地,害的我比较好多人的代码,一点一点试出来的。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std; #define si1(a) scanf("%d",&a)
#define si2(a,b) scanf("%d%d",&a,&b)
#define sd1(a) scanf("%lf",&a)
#define sd2(a,b) scanf("%lf%lf",&a,&b)
#define ss1(s) scanf("%s",s)
#define pi1(a) printf("%d\n",a)
#define pi2(a,b) printf("%d %d\n",a,b)
#define mset(a,b) memset(a,b,sizeof(a))
#define forb(i,a,b) for(int i=a;i<b;i++)
#define ford(i,a,b) for(int i=a;i<=b;i++) typedef __int64 LL;
const int N=10;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-7; char str[4][100]; struct Trie
{
int v;
Trie *next[N];
Trie()
{
v=-1;
for(int i=0;i<N;i++)
next[i]=NULL;
}
}*root; void creat_trie(char s[],int x)
{
int len=strlen(s);
Trie *p=root;
for(int i=0;i<len&&i<41;i++)//这个地方太肯爹了,明明说好的不超过40,不加i<41就超内存了,杭电你是想咋地
{
int id=s[i]-'0';
if(p->next[id]==NULL)
p->next[id]=new Trie();
p=p->next[id];
if(p->v<0)
p->v=x;
}
} void add(char a[],char b[],char c[])
{
int lena=strlen(a)-1,lenb=strlen(b)-1;
int k=0,up=0;
int x,y,z;
while(lena>=0||lenb>=0)
{
if(lena<0) x=0;
else x=a[lena]-'0'; if(lenb<0) y=0;
else y=b[lenb]-'0';
z=x+y+up;
c[k++]=z%10+'0';
up=z/10;
lena--;
lenb--;
}
if(up>0) c[k++]=up+'0';
c[k]=0;
for(int i=0;i<k/2;i++)
swap(c[i],c[k-i-1]);
// cout<<k<<" "<<c<<endl;system("pause");
} int find_trie(char st[])
{
Trie *p=root;
int len=strlen(st);
int tmp;
for(int i=0;i<len;i++)
{
int id=st[i]-'0';
if(p->next[id]==NULL)
return -1;
else
{
p=p->next[id];
tmp=p->v;
}
}
return tmp;
} void init()
{
str[1][0]='1'; str[1][1]=0;
creat_trie(str[1],0);
str[2][0]='1'; str[2][1]=0;
creat_trie(str[2],1);
for(int i=2;i<100000;i++)//注意题目是小于,不能取等号。。
{
int len1=strlen(str[1]);
int len2=strlen(str[2]);
if(len2>60)//舍去地位
{
str[2][len2-1]=0;
str[1][len1-1]=0;
}
add(str[1],str[2],str[3]); creat_trie(str[3],i);
strcpy(str[1],str[2]);
strcpy(str[2],str[3]);
}
} int main()
{
// freopen("input.txt","r",stdin);
root=new Trie();
init();
int T,ca=0;
char st[66];
si1(T);
while(T--)
{
ss1(st);
printf("Case #%d: %d\n",++ca,find_trie(st));
}
return 0 ;
}

HDU 4099 Revenge of Fibonacci (数学+字典数)的更多相关文章

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

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

  2. hdu 4099 Revenge of Fibonacci 大数+压位+trie

    最近手感有点差,所以做点水题来锻炼一下信心. 下周的南京区域赛估计就是我的退役赛了,bless all. Revenge of Fibonacci Time Limit: 10000/5000 MS ...

  3. HDU 4099 Revenge of Fibonacci Trie+高精度

    Revenge of Fibonacci Problem Description The well-known Fibonacci sequence is defined as following: ...

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

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

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

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

  6. hdu 5018 Revenge of Fibonacci

    大水题 #include<time.h> #include <cstdio> #include <iostream> #include<algorithm&g ...

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

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

  8. UVA 12333 Revenge of Fibonacci

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

随机推荐

  1. 自己动手写easyui的checkbox

    最近项目中用到了easyui这个框架,找了一圈也没有找到checkbox list控件,被迫只能自己实现了,为了便于复用,自己封装了下,有需要的,直接拿去用吧.有意见或建议的,欢迎指教啊. 调用示例 ...

  2. CentOS 5.5 Samba服务器安装总结

    centos 5.5 samba服务器安装总结先来介绍一下基本的内容windows和linux共享主要利用samba服务器,所谓SMB就是指server message block 的缩写,它是Lin ...

  3. Core Data 学习简单整理01

    Core Data是苹果针对Mac和iOS平台开发的一个框架, 通过CoreData可以在本地生成数据库sqlite,提供了ORM的功能,将对象和数据模型相互转换 . 通过Core Data管理和操作 ...

  4. js页面跳转

    js方式的页面跳转1.window.location.href方式    <script language="javascript" type="text/java ...

  5. QT5-控件-QLineEdit-文本输入控件,用来输入密码什么的还不错,可以和Linux登录一样不移动光标哦

    #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLineEdit> #i ...

  6. cocos2d-x创建新项目模板

    1.起因 长期使用项目中自带的HelloWorldScene来创建模板工程,不知大家有木有感到厌烦? 我是个懒人,所以就弄了个新的模板工程.这样最起码可以不用每次都把HelloWorldScene删掉 ...

  7. ruby on rails 中render的使用

    最近写ror,因为比较菜,很多东西不知道,只能看一点查一点了 render 先上点搜集的常用方式 render :action => "long_goal", :layout ...

  8. PHPCMS v9构建模块

    ■补课: 1.phpcms v9帮助文件,上面会写关于二次开发的一些方法. http://v9.help.phpcms.cn/ 2.找一个后台还没安装的模块,先把代码看一边.比如dianping模块 ...

  9. ionic框架,快速开发webAPP神器。

    官网地址 http://www.ionicframework.com/ 这个国外框架已经很火了.会使用插件的话更好,例如支付宝支付插件,调用摄像头拍照,二维码扫描,通讯录,文件上传,推送信息等等. 最 ...

  10. Java泛型的基本应用

    一.泛型概述 jdk1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制. 好处: 1,将运行时期的问题ClassCastException转到了编译时期. 2,避免了强制转换的麻烦. 什么时 ...