UVA 12333 大数,字典树
题意:给一个数字,看他最小是第几个菲波那切数列的前缀。
分析:
大数模板就是吊哦。
将菲波那切数列前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 大数,字典树的更多相关文章
- UVA 11732 链表+字典树
因为字符集比较大,所以就不能用简单字典树,在字典树里面,用链表进行存储.这个倒是不难,练了下手 统计的时候还是有点难搞,因为要算所有的两两比较的次数之和,对分叉处进行计算,注意细节 #include ...
- 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 ...
- UVA - 12333 字典树+大数
思路:用字典树将前40个数字记录下来,模拟大数加法即可. AC代码 #include <cstdio> #include <cmath> #include <algori ...
- UVA - 12333 Revenge of Fibonacci 高精度加法 + 字典树
题目:给定一个长度为40的数字,问其是否在前100000项fibonacci数的前缀 因为是前缀,容易想到字典树,同时因为数字的长度只有40,所以我们只要把fib数的前40位加入字典树即可.这里主要讨 ...
- UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 & 字典树)
题意: 给定n个(n<=40)数字, 求100000个以内有没有前面n个数字符合给定的数字的fibonacci项, 如果有, 给出最小的fibonacci项, 如果没有, 输出-1. 分析: 可 ...
- UVA - 11488 字典树
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 11732 strcmp() Anyone? (压缩版字典树)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- hdu 4099 Revenge of Fibonacci 字典树+大数
将斐波那契的前100000个,每个的前40位都插入到字典树里(其他位数删掉),然后直接查询字典树就行. 此题坑点在于 1.字典树的深度不能太大,事实上,超过40在hdu就会MLE…… 2.若大数加法时 ...
- UVA 11488 Hyper Prefix Sets (字典树)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
随机推荐
- vue-vli3创建的项目配置热更新
vue-vli3创建的项目配置热更新 问题描述:使用vue-cli3创建的项目,修改代码之后,浏览器页面不会自动刷新,然而之前使用webpack初始化的vue项目修改代码之后浏览器会重新加载一下,因为 ...
- GreenPlum 大数据平台--并行备份(四)
01,并行备份(gp_dump) 1) GP同时备份Master和所有活动的Segment实例 2) 备份消耗的时间与系统中实例的数量没有关系 3) 在Master主机上备份所有DDL文件和GP相关的 ...
- shell 实现文件改名
修改文件名可以有不同的命令方式,mv 可以实现,但是使用rename 这种专业的改名字很好 对于单个的文件,可以直接使用以上的命令,那如果有大量的类似格式的文件名需要修改成其他格式的,该如何呢? 创建 ...
- (转)第二十三节 inotify事件监控工具
第二十三节 inotify事件监控工具 标签(空格分隔): Linux实战教学笔记-陈思齐 原文:http://www.cnblogs.com/chensiqiqi/p/6542268.html 第1 ...
- 15019:Only the instance admin may alter the PermSize attribute
15019:Only the instance admin may alter the PermSize attribute TimesTen提示空间不足,增加空间重启后提示15019:Only th ...
- PHP一维数组去重方法array_unique()
array_unique() :去除数组中的重复项,只适用于一维数组 它不像 sort()方法, eg: $arraytest = array('tommy','tommy','abcd'); so ...
- Smart3D基础理论
目录: 1. Smart3D发展进程 2. 硬件要求与建模原理 3. Smart3D建模优势 4.Smart3D的应用领域 5. Smart3D的软件组成 6. Samrt3D主控台概述 1. Sma ...
- SQL动态配置,动态解析SQL
在项目中使用SQL动态配置的方式可以让后期的维护和发布后的修改变得更加方便,无论使用那种配置方式都离不开解析成最终真正能执行的SQL.下面代码就是一种比较简单的处理方法,SQL的参数以##括起来. 1 ...
- c# 使用队列保存图片
Invoke(new EventHandler(delegate { Bitmap bitmap2 = (Bitmap)eventArgs.Frame.Clone(); ThreadPool.Queu ...
- 02.for循环
语法: for(表达式1;表达式2;表达式3) { 循环体; } 练习1: namespace _02.for循环的练习01 { class Program { static void Main(st ...