题意:给一个数字,看他最小是第几个菲波那切数列的前缀。

分析:

大数模板就是吊哦。

将菲波那切数列前500个数字放到字典树上。注意插入的时候不能像普通一样,只在尾节点处标记,而是一路标记下去。

#include <bits/stdc++.h>

using namespace std;

const int NV = ;
const int ra = ;
int ten[] = {,ra,ra*ra,ra*ra*ra};
int radix = ra*ra*ra*ra; struct integer
{
int d[NV];
integer()
{
*this=integer();
}
integer(int x)
{
for (int i=; i<NV; i++) d[i]=;
if (!x) d[]=;
while(x)
{
d[++d[]]=x%radix;
x/=radix;
}
}
integer(long long x)
{
for (int i=; i<NV; i++) d[i]=;
if (!x) d[]=;
while(x)
{
d[++d[]]=x%radix;
x/=radix;
}
}
integer(const char s[])
{
int len=strlen(s),i,j,k;
d[]=(len-)/+;
for (i=; i<NV; i++) d[i]=;
for (i=len-; i>=; i--)
{
j=(len-i-)/+;
k=(len-i-)%;
d[j]+=ten[k]*(s[i]-'');
}
while(d[]>&&d[d[]]==) d[]--;
} string tostring()
{
string s;
int i,j,temp;
for (i=; i>=; i--) if (d[d[]]>=ten[i]) break;
temp=d[d[]];
int cnt=;
for (j=i; j>=; j--)
{
s+=(char) (temp/ten[j]+'');
if(cnt++>)return s;
temp%=ten[j];
}
for (i=d[]-; i>; i--)
{
temp=d[i];
for (j=; j>=; j--)
{
s+=(char) (temp/ten[j]+'');
if(cnt++>)return s;
temp%=ten[j];
}
}
return s;
} void output()
{
int k=d[];
printf("%d",d[k--]);
while(k) printf("%04d",d[k--]);
putchar('\n');
}
} d,mid1[]; bool operator <(const integer &a,const integer &b)
{
if (a.d[]!=b.d[]) return a.d[]<b.d[];
for (int i=a.d[]; i>; i--)
if (a.d[i]!=b.d[i])
return a.d[i]<b.d[i];
return ;
} integer operator +(const integer &a,const integer &b)
{
integer c;
c.d[]=max(a.d[],b.d[]);
int i,x=;
for (i=; i<=c.d[]; i++)
{
x+=a.d[i]+b.d[i];
c.d[i]=x%radix;
x/=radix;
}
while(x)
{
c.d[++c.d[]]=x%radix;
x/=radix;
}
return c;
}
integer operator -(const integer &a,const integer &b)
{
integer c;
c.d[]=a.d[];
int i,x=;
for (i=; i<=c.d[]; i++)
{
x+=radix+a.d[i]-b.d[i];
c.d[i]=x%radix;
x=x/radix-;
}
while(c.d[]>&&c.d[c.d[]]==) c.d[]--;
return c;
}
integer operator *(const integer &a,const integer &b)
{
integer c;
c.d[]=a.d[]+b.d[];
int i,j,x=;
for (i=; i<=a.d[]; i++)
{
x=;
for (j=; j<=b.d[]; j++)
{
x=a.d[i]*b.d[j]+x+c.d[i+j-];
c.d[i+j-]=x%radix;
x/=radix;
}
c.d[i+b.d[]]=x;
}
while(c.d[]>&&c.d[c.d[]]==) c.d[]--;
return c;
} integer operator *(const integer &a,const long long &k)
{
integer c;
c.d[]=a.d[];
int i;
long long x=;
for (i=; i<=a.d[]; i++)
{
x+=a.d[i]*k;
c.d[i]=x%radix;
x/=radix;
}
while(x>)
{
c.d[++c.d[]]=x%radix;
x/=radix;
}
while(c.d[]>&&c.d[c.d[]]==) c.d[]--;
return c;
}
long long rem;
integer operator /(const integer &a,const long long &k)
{
integer c;
c.d[]=a.d[];
long long x=;
for (int i=a.d[]; i>=; i--)
{
x+=a.d[i];
c.d[i]=x/k;
x%=k;
rem=x;
x*=radix;
}
while(c.d[]>&&c.d[c.d[]]==) c.d[]--;
return c;
} bool smaller(const integer &a,const integer &b,int delta)
{
if (a.d[]+delta!=b.d[]) return a.d[]+delta<b.d[];
for (int i=a.d[]; i>; i--)
if (a.d[i]!=b.d[i+delta])
return a.d[i]<b.d[i+delta];
return ;
} void Minus(integer &a,const integer &b,int delta)
{
int i,x=;
for (i=; i<=a.d[]-delta; i++)
{
x+=radix+a.d[i+delta]-b.d[i];
a.d[i+delta]=x%radix;
x=x/radix-;
}
while(a.d[]>&&a.d[a.d[]]==) a.d[]--;
} integer operator /(const integer &a,const integer &b)
{
integer c;
d=a;
int i,j,temp;
mid1[]=b;
for (i=; i<=; i++) mid1[i]=mid1[i-]*;
for (i=a.d[]-b.d[]; i>=; i--)
{
temp=;
for (j=; j>=; j--)
{
if (smaller(mid1[j],d,i))
{
Minus(d,mid1[j],i);
c.d[i+]+=temp;
}
temp/=;
}
}
c.d[]=max(,a.d[]-b.d[]+);
while(c.d[]>&&c.d[c.d[]]==) c.d[]--;
return c;
} bool operator ==(const integer &a,const integer &b)
{
if (a.d[]!=b.d[]) return ;
for (int i=; i<=a.d[]; i++)
if (a.d[i]!=b.d[i])
return ;
return ;
} const int maxnode = +;
const int sigma_size = ; struct Trie {
int ch[maxnode][sigma_size];
int val[maxnode]; int sz;
Trie() {sz=;memset(ch[],,sizeof(ch[]));memset(val,,sizeof(val));}
int idx(char c) {return c - '';} void insert(char *s, int v) {
int u = , n = strlen(s);
for (int i = ; i < n; i++) {
if(val[u]==) val[u]=v;
int c = idx(s[i]);
if (!ch[u][c]) {
memset(ch[sz], , sizeof(ch[sz]));
ch[u][c] = sz++;
}
u = ch[u][c]; }
if(val[u]==) val[u] = v;
} int values(char* s) {
int u = ,n = strlen(s);
for(int i=;i<n;i++) {
int c = idx(s[i]);
if(!ch[u][c]) return -;
u = ch[u][c];
}
//printf("%d\n",val[u]);
return val[u]; } }sol; void init() {
integer a = ,b = ;
char qwq[] = "";
sol.insert(qwq,);
for(int i=;i<;i++) {
if(i%) {
a = a+b;
strcpy(qwq,a.tostring().c_str());
}
else {
b = a+b;
strcpy(qwq,b.tostring().c_str());
}
sol.insert(qwq,i);
}
} int main()
{
//freopen("in.txt","r",stdin);
init();
int t;
scanf("%d",&t); int kase = ;
char st[];
while(t--) {
scanf("%s",st);
int ans = sol.values(st);
if(ans==) ans =;
printf("Case #%d: %d\n",kase++,ans); }
return ;
}

UVA 12333 大数,字典树的更多相关文章

  1. UVA 11732 链表+字典树

    因为字符集比较大,所以就不能用简单字典树,在字典树里面,用链表进行存储.这个倒是不难,练了下手 统计的时候还是有点难搞,因为要算所有的两两比较的次数之和,对分叉处进行计算,注意细节 #include ...

  2. UVA - 12333 Revenge of Fibonacci (大数 字典树)

    The well-known Fibonacci sequence is defined as following: F(0) = F(1) = 1 F(n) = F(n − 1) + F(n − 2 ...

  3. UVA - 12333 字典树+大数

    思路:用字典树将前40个数字记录下来,模拟大数加法即可. AC代码 #include <cstdio> #include <cmath> #include <algori ...

  4. UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树

    题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...

  5. UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 & 字典树)

    题意: 给定n个(n<=40)数字, 求100000个以内有没有前面n个数字符合给定的数字的fibonacci项, 如果有, 给出最小的fibonacci项, 如果没有, 输出-1. 分析: 可 ...

  6. UVA - 11488 字典树

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

  7. UVA 11732 strcmp() Anyone? (压缩版字典树)

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

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

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

  9. UVA 11488 Hyper Prefix Sets (字典树)

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

随机推荐

  1. AppInventor2笔记

    将视觉化的 块语言 翻译为 Android上的实现 的编译器使用了Kawa语言框架,而Kawa是Scheme编程语言的方言,由Per Bothner开发,并由自由软件基金会发布,它是GNU操作系统的一 ...

  2. Farey Sequence(欧拉函数板子题)

    题目链接:http://poj.org/problem?id=2478 Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  3. 搭架Ubuntu的 apt-cacher服务

    源服务器名称可能不太准确,意思是创建内网自己的私服,这样只要有Ubuntu通过该私服下载安装过软件,私服都会缓存,下一个Ubuntu的请求就直接从缓存中获取. 最近Ubuntu源服务器太慢了,北京的网 ...

  4. C#的split()分割字符串

    简单的说: 在C#中 str.Split("===="); //这样是错误的,只能 str.Split('=');//参数只能是char类型的,不能是字符串的 如果非得要以字符串分 ...

  5. Prestashop使用心得

    如果对Prestashop好奇的小伙伴快点进来看看吧,我开始接触了Prestashop这个开源的系统,这个一个非常棒的电商系统.因为我对这个Prestashop系统完全没有了解,但是上网却看不到太多的 ...

  6. 在 Flask 应用中使用 gevent

    在 Flask 应用中使用 gevent 普通的 flask 应用 通常在用 python 开发 Flask web 应用时,使用 Flask 自带的调试模式能够给开发带来极大便利.Flask 自带的 ...

  7. jQuery 菜单小练习(实现点击和移动鼠标效果)

    这个代码的练习是点击事件后 如何用jQuery联动的方式找到相关标签 实现的结果是点击菜单一或者菜单二等 会出现相关菜品,并隐藏其他菜品.鼠标移动才菜品上会在右侧框内出现相关菜品的价格.实现特殊的效果 ...

  8. PCU

    PCU(Peak concurrent users ),互联网术语,应用在网络游戏和其他互联网服务领域,意思是最高同时在线人数 业务系统架构性能提升主要分为两种不同的方式,scale-out(横向扩展 ...

  9. 适用于所有页面的基础样式base.css

    @charset "UTF-8"; /*css 初始化 */ html, body, ul, li, ol, dl, dd, dt, p, h1, h2, h3, h4, h5, ...

  10. SpringSecurity 3.2入门(7)自定义权限控制介绍

    总结Spring Security的使用方法有如下几种: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中. 二种是用户和权限用数据库存储,而资源(url)和权限的对应关系硬编 ...