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

分析:

大数模板就是吊哦。

将菲波那切数列前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. 理解fig,ax = plt.subplots()

    fig = plt.figure() ax = fig.add_subplot(1,1,1) fig, ax = plt.subplots(1,3),其中参数1和3分别代表子图的行数和列数,一共有 1 ...

  2. 日志收集之filebeat

    一,软件介绍 Filebeat是一个轻量级日志传输Agent,可以将指定日志转发到Logstash.Elasticsearch.Kafka.Redis等中.Filebeat占用资源少,而且安装配置也比 ...

  3. adb调试安卓

    http://blog.csdn.net/liushida00/article/details/49797239

  4. roboframework-ride运行案例时报 Error 267 错误问题

    偶然间碰到这个问题,检查下路径是否有中文,如有中文换成英文试试. (ps:通常自己创建的中文路径也是可以的,我的案例是从Linux环境中创建拷贝过来的,可能导致案例路径编码问题)

  5. Oracle中查询关键字select--from--where--group by--having--order by执行顺序

    select--from--where--group by--having--order by 这6个查询关键字的执行顺序: 1.from组装来自不同数据源的数据:2.where基于指定的条件对记录行 ...

  6. IE678不兼容CSS3 user-select:none(不可复制功能),需要JS解决

    [方法一:CSS3实现文本不可复制] .content {-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-o- ...

  7. FZU 1921——栀子花开——————【线段树单点更新】

    栀子花开 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  8. Javascript 简单实现鼠标拖动DIV

    http://zhangbo-peipei-163-com.iteye.com/blog/1740078 比较精简的Javascript拖动效果函数代码 http://www.jb51.net/art ...

  9. C#委托的好处

    C#委托的好处 先来看一个例子: 某人有三子,让他们各自带一样东西出门,并带回一头猎物. 可以理解为一种父亲对儿子的委托: 猎物  办法(工具 某工具) 三个人执行委托的方法各不相同 兔子 打猎(工具 ...

  10. scp命令的使用

    scp命令是什么 scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. scp命令用法 scp [-1246BCpqrv] [-c cipher ...