要想通这个题目应该很容易,由于斐波纳契数在近100项之后很大,早就超出long long了。而输入最长的序列才40个数字,所以大约保留前50位,前40位是没有误差的!!!其实,想想我们判断double数字相等时fabs(a-b)<1e-10来忽略double数字由于加法带来的误差,道理是一样的,甚至C++默认的还是1e-5。而保险起见,我的方法中保留了100位。当然这个保留50位的数字加法,也只能模拟一遍,因为要计算10^5项。

  然而测试样例有50000组,所以我们先要对输入的字符串做一个字典树!虽然我没学过也没听过,后来AC了队友跟我说这个叫字典树,写个博客纪念一下。

  YY一下,我弹了近8次,前3次因为没有建字典树超时,后5次竟然是因为第0项也是计入的,斐波那契序列为1,1,2,3,5,8……。而我竟然认为第一个1不算的。擦擦,其实样例都没过,我一直以为过了,然后还找不到思路错哪了。我是有多眼瞎啊!!!今年还有最后一次机会,希望比赛拿点成绩,千万别再坑这里了。

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxlen=;
const int maxn=maxlen+;
char target[];
int active_id,active_idx;
void ccplus(char *&ch,int &cl,char *&sh,int &sl){
if(cl < sl) ch--,cl++, ch[]='';
char carry=; int idx=cl;
while(idx--){
ch[idx] += sh[idx]+carry-'';
if(ch[idx] > '') ch[idx]-=, carry=;
else carry=;
}
if(carry) ch--,cl++, ch[]='';
if(cl > ) cl--, sl--;
ch[cl]='\0';
//if(active_idx <= 25) printf("active_idx = %d, ch = %s, cl = %d\n",active_idx,ch,cl);
swap(ch,sh); swap(cl,sl);
}
char f1[maxn],f2[maxn];
char *ch,*sh;
int cl,sl;
const int maxt=;
struct tree{
int id;
int next[];
void init(int i=-){ id=i; for(int j=;j<;j++) next[j]=-; }
}tr[maxt*];
int tcnt=;
int value[maxt],idnext[maxt];
void make_tree(int idx,char *tt){
//printf("idx = %d, tt[1] = %s\n",idx,tt+1); //char cc; cin>>cc;
if(tt[]=='\0'){
if(tr[idx].id <= ) tr[idx].id = active_id;
else {
int t = tr[idx].id;
while(idnext[t] > ) t = idnext[t];
idnext[t] = active_id;
}
return;
}
int ne=tt[]-'';
//if(ne < 0) cout<<"fuck ne = "<<ne<<endl;
if(tr[idx].next[ne] <= )
tr[idx].next[ne]=tcnt, tr[tcnt].init(), tcnt++;
make_tree(tr[idx].next[ne],tt+);
}
void search_tree(int idx,char *tt){
int id=tr[idx].id;
if(id > && value[id] < ) {
value[id]=active_idx;
while(idnext[id] > ) id=idnext[id], value[id]=active_idx;
}
int ne=tt[]-'';
if(tt[] == '\0' || tr[idx].next[ne] <= ) return;
search_tree(tr[idx].next[ne],tt+);
}
int main()
{
int cases; cin>>cases;
memset(idnext,-,sizeof(idnext));
memset(value,-,sizeof(value));
tr[].init();
for(int cas=;cas<=cases;cas++) {
scanf("%s",target+);
active_id = cas;
make_tree(,target);
//cout<<"case "<<cas<<" is over!"<<endl;
}
ch=&f1[maxn-],sh=&f2[maxn-];
ch[]='', ch[]='\0';
sh[]='', sh[]='\0';
cl=sl=;
active_idx=; search_tree(,ch-);
active_idx=; search_tree(,ch-);
active_idx=; search_tree(,sh-);
active_idx=;
while(active_idx < maxlen)
ccplus(ch,cl,sh,sl), search_tree(,sh-), active_idx++;
for(int cas=;cas<=cases;cas++)
printf("Case #%d: %d\n",cas,value[cas]);
return ;
}

  

hdu4099的更多相关文章

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

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

  2. HDU4099(斐波那契数列与字典树)

    题目:Revenge of Fibonacci 题意:给出斐波那契数列的前k位,k不超过40,找出最小的正整数n,满足F(n)的前k位与给定数的前k位相同,斐波那契数列的项数不超过100000. 解析 ...

  3. hdu4099 Revenge of Fibonacci 字典树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4099 思想很容易想到 就是预处理出前10w个的fib数,然后建树查询 建树时只用前40位即可,所以在计 ...

  4. HDU--4099

    题目: Revenge of Fibonacci 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4099 分析:字典树的应用.在求Fibonacci的前 ...

  5. hdu4099 Revenge of Fibonacci

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

  6. hdoj4099(字典树+高精度)

    题目链接:https://vjudge.net/problem/HDU-4099 题意:给T组询问,每个询问为一个字符串(长度<=40),求以该字符串为开始的fibonacci数列的第一个元素的 ...

随机推荐

  1. javascript数组去重算法-----3

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. andengine游戏引擎总结进阶篇1

    本篇包括虚拟键盘,粒子系统 1虚拟键盘 分为两种,一种是单个虚拟键盘,另一种是多个方位虚拟键盘 1)加载虚拟键盘所需要的图片资源 private BitmapTextureAtlas mOnScree ...

  3. 使用win8时删除自带的输入法的好方法

    无直接把那个语言都删了,再直接装输入法就行了.

  4. php缓存生成及更新实现参考哦

    <?php //如果在find/findAll里传入了参数,则该参数即为key ORM::factory('article')->where('user_id', '=', '2')-&g ...

  5. SQL函数:字符串中提取数字,英文,中文,过滤重复字符(转)

    --提取数字 IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL DROP FUNCTION DBO.GET_NUMBER2 GO )) ) AS BEGIN BE ...

  6. MJExtension

    MJExtension 长话短说下面我们通过一个列子来看下怎么使用 1. 先把框架拉进去你的项目 2. 首先我这次用到的json最外层是一个字典,根据数据的模型我们可以把这个归类为字典中有数组,数组中 ...

  7. HighlightingSystem插件使用(边缘发光)

    插件链接: http://pan.baidu.com/s/1dFwkaTr 密码: nw2c 导入Unity里面可能会报错,不过没关系,直接注释掉就可以了,我用的是Unity5.1的版本 可以看到如下 ...

  8. [一个经典的多线程同步问题]解决方案三:互斥量Mutex

    本篇通过互斥量来解决线程的同步,学习其中的一些知识. 互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源.使用互 ...

  9. Programming C#.Classes and Objects.只读字段

    只读字段 当字段声明中含有 readonly 修饰符时,该声明所引入的字段为只读字段.给只读字段的直接赋值只能作为声明的组成部分出现,或在同一类中的实例构造函数或静态构造函数中出现.(在这些上下文中, ...

  10. 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出。

    编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 题目描述 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 输入描述 编写程序输入一个5x5的矩阵 ...