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 ...
随机推荐
- UML-3-案例研究
没有什么比恰当的举例更难的了.-----马克吐温
- Transform 引起的 z-index "失效"
重新学习CSS后的第三天,学习制作阴影的过程中,发现的问题:设置了box-shadow后展现的阴影: 添加transform:rotate(10deg);后的效果: 查看CodePen例子:阴影效果 ...
- 关于工具类静态方法调用@Autowired注入的service类问题
@Component //此处注解不能省却(0) 1 public class NtClient { 2 /** 3 * 日志 4 */ 5 private static String clazzNa ...
- 设置IIS允许下载.config文件
<configuration> <system.webServer> <security> <requestFilteri ...
- SQL Server 2008 SQL2012 SQL2014 收缩日志 清空删除大日志文件
SQL2008 SQL2012 SQL2014 的收缩日志 由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消:(SQL2005)Bac ...
- 60分钟内从零起步驾驭Hive实战学习笔记(Ubuntu里安装mysql)
本博文的主要内容是: 1. Hive本质解析 2. Hive安装实战 3. 使用Hive操作搜索引擎数据实战 SparkSQL前身是Shark,Shark强烈依赖于Hive.Spark原来没有做SQL ...
- MYSQ系列-MYSQL基础增强(Mysql基本语句)
MYSQL基础增强 库操作 创建一个使用UTF-8字符集的数据库: create database mydb character set UTF8; 创建一个带校对集的数据库 create datab ...
- HDU 5316——Magician——————【线段树区间合并区间最值】
Magician Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- Java学习第二十五天
1:如何让Netbeans的东西Eclipse能访问. 在Eclipse中创建项目,把Netbeans项目的src下的东西给拿过来即可. 注意:修改项目编码为UTF-8 2:GUI(了解) (1)用户 ...
- 【VMware】安装不同系统的虚拟机出现开机黑屏的情况
解决方法一: 1.以管理员身份运行命令提示符(cmd.exe),输入命令 netsh winsock show catalog 按下回车键执行命令(可以看到VMware注册了两个LSP:vSocket ...