hdu4099
要想通这个题目应该很容易,由于斐波纳契数在近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的更多相关文章
- HDU4099 Revenge of Fibonacci(高精度+Trie)
Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 204800/204800 K (Java/ ...
- HDU4099(斐波那契数列与字典树)
题目:Revenge of Fibonacci 题意:给出斐波那契数列的前k位,k不超过40,找出最小的正整数n,满足F(n)的前k位与给定数的前k位相同,斐波那契数列的项数不超过100000. 解析 ...
- hdu4099 Revenge of Fibonacci 字典树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4099 思想很容易想到 就是预处理出前10w个的fib数,然后建树查询 建树时只用前40位即可,所以在计 ...
- HDU--4099
题目: Revenge of Fibonacci 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4099 分析:字典树的应用.在求Fibonacci的前 ...
- hdu4099 Revenge of Fibonacci
题意:给定fibonacci数列,输入前缀,求出下标.题目中fibonacci数量达到100000,而题目输入的前缀顶多为40位数字,这说明我们只需要精确计算fibinacci数前40位即可.查询时使 ...
- hdoj4099(字典树+高精度)
题目链接:https://vjudge.net/problem/HDU-4099 题意:给T组询问,每个询问为一个字符串(长度<=40),求以该字符串为开始的fibonacci数列的第一个元素的 ...
随机推荐
- iOS 开发常用设置
1. iOS设置app应用程序文件共享 设置流程 xcode 打开项目----在 info.plist 文件,添加 UIFileSharingEnabled 并设置属性为 YES, 在app内部,将您 ...
- Android消息推送之GCM方式(二)
<声明> 转载请保留本来源地址: http://blog.csdn.net/wzg_1987/article/details/9148023 上一节讲了GCM方式实现前的一些必要准备工作, ...
- Android中数据库的操作流程详解
Android中数据库的操作方法: 1.Android平台提供了一个数据库辅助类来创建或打开数据库. 这个辅助类继承自SQLiteOpenHelper类.继承和扩展SQLiteOpenHelper类主 ...
- C#的输入输出及基本类型
//输出 Console.WriteLine("摩西摩西"); Console.Write("hollo");不带回车的 注意: 1.注意大小写敏感.(快捷键操 ...
- DEV控件之ChartControl用法
一.总体概述 这个控件包含3层,最外面的chartControl层.中间的XYDiagram层.最里面的Series层.功能非常强大,但同时使用起来也相对复杂,需要各个层之间相互协调设置才能达到自己想 ...
- QRMaker生成二维码,支持中文
QRMaker如果想支持中文,可以将中文转为UTF8,然后用InputDateB直接传入Byte() Option Explicit Private Declare Function WideChar ...
- Maven命令行创建web项目,并部署到jobss当中(解决No plugin found for prefix 'jboss-as' in the current project and in the plugin groups [org.apache.maven.plugins,问题)
首件创建项目:此处可参照:http://maven.apache.org/guides/mini/guide-webapp.html mvn archetype:generate -DgroupId= ...
- 在PreparedStatement中设置空值
在PreparedStatement中设置空值 分类: Work& Study java2009-09-10 09:56 922人阅读 评论(0) 收藏 举报 nulltypes数据库 ...
- javascript中对象的不同创建方法
javascript中的对象与一般的面向对象的程序设计语言(c++,Java等)不同,甚至很少有人说它是面向对象的程序设计语言,因为它没有类.javaScript只有对象,不是类的实例.javascr ...
- getDeclaredFields()和getFields()
getFields()获得某个类额的所有的公共(public)的字段,包括父类. getDeclaredFields()获得某个类的所有申明的字段,即包括public.private和proteced ...