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

分析:

大数模板就是吊哦。

将菲波那切数列前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. Java中使用nextLine(); 没有输入就自动跳过的问题

    转自:https://www.cnblogs.com/1020182600HENG/p/6564795.html [问题分析] 必要的知识:in.nextLine();不能放在in.nextInt() ...

  2. 设计模式学习总结(八)策略模式(Strategy)

    策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...

  3. spark第二篇:Application Submission Guide

    提交应用 Spark的bin目录中的spark-submit脚本用于启动集群上的应用程序.它可以通过一个统一的接口使用所有Spark支持的集群管理器. 绑定应用程序的依赖 如果你的代码依赖其他项目,你 ...

  4. 引导篇之web结构组件

    web结构组件有如下几种: 代理 HTTP代理服务器,是Web安全.应用集成以及性能优化的重要组成模块.代理位于客户端和服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求 ...

  5. 构建标准OpenStack API接口文档

    1.构建API接口文档标准参考: http://docs.openstack.org/contributor-guide/api-guides.html 2.构建API接口文档步骤参考下面的Patch ...

  6. (转)如何在Linux中统计一个进程的线程数

    如何在Linux中统计一个进程的线程数 原文:http://os.51cto.com/art/201509/491728.htm 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会 ...

  7. Tor网络介绍

    Tor网络介绍 1.Tor的全称是“The Onion Router”,“An anonymous Internet communicaton system:通过Tor访问一个地址时,所经过的节点在T ...

  8. java collection与数组(Array)互转

    先确定几个概念,这里说的数组元素,除基本类型数组外,并非指元素对象本身,而是它们的引用.换句话说,基本数组的元素是数值本身,非基本数组的元素都是一个地址(对应指针). 1.collection的元素不 ...

  9. 【Shell】按行读取文件内容

    方法1:while循环中执行效率最高,最常用的方法. function while_read_LINE_bottm(){ While read LINE do echo $LINE done < ...

  10. NPOI之C#下载Excel

    Java中这个类库叫POI,C#中叫NPOI,很多从Java一直到.Net平台的类库为了区别大部分都是在前面加个N,比如Hibernate和NHibernate. npoi下载地址 一.使用NPOI下 ...