算法竞赛入门经典 第二版 习题5-15 Fibonacci的复仇 Revenge of Fibonacci uva12333

Linux Fib实现分析 linux内核早先对于ipv4的fib支持Hash与trie两种数据组织方式,后续删除了hash,只留下了trie。 trie是一种最长前缀匹配算法,对于大量路由的情况下查找效率高于hash,但是这种算法会消耗更多的内存、算法更加复杂。 图1 原始数据 图2 trie 将图1中的数据用trie表示那么就可以得到图2的模型。那么是怎么画出这幅图的呢?实际上就是从根节点触发,往左子树走一步则增加一个... 阅读详情

题目:https://vjudge.net/problem/UVA-12333

思路: 大整数类+字典树
一开始套刘汝佳大整数类的板子套出好多问题,之后自己用string重新封装了一个。
用大整数类求出斐波那契数列然后将前42位插入字典树,便于之后查找前缀。

这题做出了灵异事件,在自己机器上预处理好几分钟都跑不完结果交上去竟然AC了。。。。。

代码:c++

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

const int maxn = 100000;
const int INF = 2147483647;

struct BigInteger
{
    string s;
    BigInteger(long long num = 0)
    {
        if (num == 0)
        {
            s.push_back(0);
        }
        else
        {
            while (num > 0)
            {
                s.push_back(num % 10);
                num /= 10;
            }
        }
    }
    BigInteger(const BigInteger &t)
    {
        s = t.s;
    }
    void operator = (const BigInteger &t)
    {
        s = t.s;
    }
    string tostring()
    {
        string ans;
        for (int i = s.size() - 1; i >= 0; i--)
        {
            ans.push_back(s[i] + '0');
            if (ans.size() >= 45)
            {
                break;
            }
        }
        return ans;
    }
    BigInteger operator + (const BigInteger &t)
    {
        BigInteger ans;
        ans.s.clear();
        int i = 0;
        bool carry_over = false;//进位标志
        const string &minn = s.size() < t.s.size() ? s : t.s;
        const string &maxx = t.s.size() > s.size() ? t.s : s;
        for (; i < minn.size(); i++)
        {
            int a = minn[i] + maxx[i] + carry_over;
            if (a >= 10)
            {
                a %= 10;
                carry_over = true;
            }
            else
            {
                carry_over = false;
            }
            ans.s.push_back((char)a);
        }
        for (; i < maxx.size(); i++)
        {
            int a = maxx[i] + carry_over;
            if (a >= 10)
            {
                a %= 10;
                carry_over = true;
            }
            else
            {
                carry_over = false;
            }
            ans.s.push_back((char)a);
        }
        if (carry_over)
        {
            ans.s.push_back(1);
        }
        return ans;
    }
};

struct Node
{
    int minindex;
    Node *next[20];
    Node() : minindex(INF)
    {
        memset(next, 0, sizeof(next));
    }
};

struct Trie
{
    Node *root;
    Trie()
    {
        root = new Node();
    }
    ~Trie()
    {
        clear(root);
    }
    void clear(Node *cur)
    {
        for (int i = 0; i < 10; i++)
        {
            if (cur->next[i] != NULL)
            {
                clear(cur->next[i]);
            }
        }
        delete cur;
    }
    void insert(string s, int index)
    {
        Node *cur = root;
        int j = 0;
        for (int i = 0; i < s.size(); i++)
        {
            int a = s[i] - '0';
            if (cur->next[a] == NULL)
            {
                cur->next[a] = new Node();
            }
            cur = cur->next[a];
            cur->minindex = min(cur->minindex, index);
        }
    }
    int search(char s[])
    {
        Node *cur = root;
        int len = strlen(s);
        for (int i = 0; i < len; i++)
        {
            if (cur->next[s[i] - '0'] == NULL)
            {
                return -1;
            }
            else
            {
                cur = cur->next[s[i] - '0'];
                if (i == len - 1)
                {
                    return cur->minindex;
                }
            }
        }
    }
};

Trie fibtrie;

void calfib()
{
    BigInteger a(1);
    fibtrie.insert(a.tostring(), 0);
    BigInteger b(1);
    fibtrie.insert(b.tostring(), 1);
    BigInteger c;
    for (int i = 2; i < maxn; i++)
    {
        c = a + b;
        fibtrie.insert(c.tostring(), i);
        a = b;
        b = c;
    }
}

int main()
{
    calfib();
    int T;
    cin >> T;
    char s[100];
    for (int cases = 1; cases <= T; cases++)
    {
        scanf("%s", s);
        printf("Case #%d: %d\n", cases, fibtrie.search(s));
    }
    return 0;
}
linux网络协议栈分析笔记12-路由2-FIB1 上一章我们看到了通过fib_lookup去查找了路由信息,这一章我们就看看fib到底是什么 FIB(Forward Information Base) 转发信息库 inet_init()->ip_init()->ip_rt_init()-> ipv4_dst_ops.kmem_cachep =           kmem_cache_create("ip_dst_cache" 阅读详情

相关推荐

HDURevenge of Fibonacci --- 高精度 + 斐波那契数列 + 字典树

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/Others) Total Submission(s): 2110    Accepted Submission(s): 504 Problem Description The well-known Fibonacci

杨鑫newlife的专栏 2089

key_vector详解

介绍Linux网络路由所用到的key_vector结构

weixin_46381158的博客 895

Librepilot _64位window10环境下的搭建及一些坑的解决办法

  刚入IT行业的小菜鸟,在window上折腾了四天的librepilot地面控制站的搭建,想着这么辛苦不能白费了,看网上相关资料少得可怜,唯一一个详细教程还是在32位环境下,一大堆坑,所以把自己的经验写下来,供大家一起参考。 参考的原文是:https://www.cnblogs.com/jasonchan1202/p/7809937.html的博客,但是执行下来才发现这个博客对64位系统极其不...

weixin_41426339的博客 2728

IPv4路由信息查看fib_trie

创建路由表10,并在其中添加三条路由项: # sudo ip route add 1.1.1.0/24 via 192.168.2.2 table 10 # sudo ip route add 1.1.0.0/16 via 192.168.2.3 table 10 # sudo ip route add 1.0.0.0/8 via 192.168.2.4 table 10 # # ip -d route show table 10 unicast 1.0.0.0/8 via 192.16

redwingz的博客 1600

淘宝链接跳转微信全攻略:自建合规中转页实现私域引流

在跨平台运营中,链接跳转是连接不同生态、实现流量引导的关键技术。其核心原理是通过服务器端或前端逻辑,将用户从一个平台的链接安全引导至目标页面,同时规避平台间的访问限制。这项技术的核心价值在于打破数据孤岛,实现跨平台用户沉淀与精细化运营,广泛应用于电商引流、私域流量构建和跨平台营销等场景。本文聚焦于**淘宝短链**与**企业微信**之间的跳转难题,提供了一套基于自建中转页面的完整工程解决方案,手把手教你如何通过合规的技术手段,将淘宝流量高效、安全地引导至微信生态,并实现数据追踪与客户分流。

weixin_34185512的博客 411

《IC验证必看|IC验证的全流程概览(从DUT到回归交付)》

本文系统介绍了IC验证的全流程,从理解设计需求到最终交付验证结果。主要内容包括:1)深入理解DUT的功能和接口;2)制定详细的测试计划(Testplan);3)搭建UVM验证平台;4)执行定向和随机测试并进行回归;5)分析功能、代码和断言覆盖率;6)交付完整的验证报告。文章强调验证是一个闭环过程,特别指出新手容易忽视测试计划和覆盖率分析这两个关键环节,导致验证不充分。文末还提出思考题,引导读者反思验证计划的制定方法。

m0_46663240的博客 1261

路由表的结构与算法分析--trie插入

在linux的trie树中插入一条路由是很复杂的,远比查找要复杂的多,因为每插入一条路由就要看看是否要动态调整trie树,不是还好,如果要动态调 整,那活儿就大了,正是因为这一点,trie路由表往往在大型的机器上用到,那些机器不吝啬动态调整trie树的时候的空间损失,如果是性能不那么靠铺的 机器,还是老老实实用哈希路由表吧,只要不是疯狂插入很多路由表导致很多哈希碰撞,性能是很棒的,我在pc上装过t

TCP/IP 8859

SEED-VIG数据集实战:5步搞定驾驶员疲劳检测模型(附Python代码)

本文提供了一份基于SEED-VIG数据集的驾驶员疲劳检测模型实战指南。通过五个核心步骤——数据准备、特征提取、模型训练、优化评估及部署思路,详细讲解了如何利用脑电信号构建分类器,并附有完整的Python代码,帮助开发者快速上手这一智能座舱关键技术。

w1x2y3的博客 263

IPv4路由别名fib_alias

fib_alias用于连接tries树节点和基础的fib_info结构。 在新增路由表项时,如果没有合适的fib_alias可用,可用表示新增表项和已有fib_alias的tos,priority,以及type,scope相同,并且使用相同的fib_info,则需要创建新的fib_alias结构。 添加fib_alias 如果在tries树中没有找到可插入fib_alias的叶子节点,即节点l为空,使用函数fib_insert_node添加节点以及相关联的新的fib_alias结构(参见 IPv4路由tri

redwingz的博客 770

本地部署开源视频会议解决方案 Jitsi Meet 并实现外网访问

Jitsi Meet 是一款基于 WebRTC 技术的开源视频会议解决方案,它允许用户通过互联网进行高质量的视频通话、语音通话和文本聊天,非常适合用于在线教育、远程办公、团队协作等场景。本文将详细介绍如何利用 Docker 在本地部署 Jitsi Meet 并结合路由侠实现外网访问本地部署的 Jitsi Meet。

lyxnwct的博客 1946

【知识分享】IBIS 建模指南 03

本文介绍了差分缓冲器的数据提取方法,重点分析了差分系统与单端系统的核心差异。文章详细阐述了差分接收机和驱动器的结构特点、工作原理及建模方法,指出全差分结构具有优异的电源噪声抑制能力。针对IBIS建模规范,作者提出了三维I-V曲面数据提取技术,并介绍了共模/差模电流分离、片上端接处理以及V-T表生成的解决方案。文章还探讨了差分电容(C_diff)的测量方法和数据简化策略,为复杂差分缓冲器的精确建模提供了系统化的技术路径。

一只豌豆象的博客 1282

Linux路由表的一些资料

<br /> <br />使用下面的 route 命令可以查看 Linux 内核路由表。 # routeDestination Gateway Genmask Flags Metric Ref Use Iface<br />192.168.0.0 * 255.255.255.0 U 0 0 0 eth0<br />169.254.0.0 * 255.255

青帝的专栏 8301

ICC2: pin shape不在track上引起的drc如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 435

UVA 12333 - Revenge of Fibonacci (斐波那契的复仇) 【后日谈】by SuCicada

正篇以及正确解题思路和代码参见 UVA 12333 - Revenge of Fibonacci (斐波那契的复仇) by SuCicada 此篇为后日谈 要说为什么专门开一篇来记录想法呢,主要是因为想说的太多了。首先从UVA的提交记录上来看,上一次答题是在足足1年之前了。 这么久以来都没有再好好做算法,感觉快要忘本了。而且出来之后脑子也不是那么灵光了,虽然更理性,但是却少了些抽象的想象力。...

SuCicada 小米的蝉 572

【红外技术】DDE算法:HE在红外图像可视化上的应用(附源码)

并且数据一般是以 8 的整数倍的位宽在电子系统中应用,因此大多数的显示器的显示位宽为 8bit,共 256 个灰阶。为了使红外图像可视化,因此需要一种“数据压缩”技术,还需要既可能的不丢失原始图像信息。HE后的图像直方图分布比较均匀离散,图像对比度好。但是HE算法只是适用某些图像,它是将灰度集中区域进行拉伸得到,也会放大该集中区域的噪声,它是一种“不公平”的映射。以下是红外细节增强算法的演示,很明显右边的图像,展现了更多的图像细节,对于小目标的观测非常友好。文章已于2019-12-02修改。

sunwindl91181的博客 911

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

习题5-15 Fibonacci的复仇(Revenge of Fibonacci,ACM/ICPC Shanghai 2011,UVa12333)

原题链接:https://vjudge.net/problem/UVA-12333 分类:STL综合 备注:大整数类,缩小范围 前言:UVA这提交系统也太不给力了,崩了好久。我的代码借鉴了一篇博客:https://www.cnblogs.com/jionkitten/p/12259389.html。主要思想是只存前8位数,这个题就算预处理特别慢,搜索是很快的,尝试存其它位数说不定也可以。 代码如下...

TK_wang_的博客 415

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构习题答案(全部算法)---严蔚敏版

第一章绪论1.16 void print_descending(int x,int y,int z)//按从大到小顺序输出三个数{scanf("%d,%d,%d",&x,&y,&z);if(xy; //为表示交换的双目运算符,以下同if(yz;if(xy; //冒泡排序printf("%d %d %d",x,y,z);}//print_descending 1.17 Status

leehom_zlj的专栏 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

路由1--LC-trie( level-compressed trie )

linux中路由表用的是LC-trie,先看下数据结构:

u014211079的专栏 4386

思科VPP源码分析(路由框架分析二)

基本理论

呆呆辉的专栏 9219

Linux内核配置

基于Linux Kernel v2.6.36-gentoo-r5 General setup --->[*]Prompt for development and/or incomplete code/drivers//默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的代码与驱动.你应该选择它,因为有许多设备可能必需选择这个选项才能进行配置,实际上它是安全的。 () Cross-compiler tool prefix //交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。默认

huabiaochen的博客 3396

习题5-15 uva12333 Fibonacci的复仇

斐波那契数列 : 1,1,2,3,5,8 ......,F(n) = F(n-1) + F(n-2) ,F(0)=F(1)=1任务:给出一个斐波那契数的前几个数字(不超过40个数字),找出以它开头的最小的Fibonacci数的序号。如果序号小于100000的Fibonacci数均不符合条件,输出-1.坑点:卡时间,首先是10万个数必须都要求出来,才能判断是不是有符合的,然后这题的数据规模是 小于等...

落叶秋风早的博客 673

算法入门经典第六章 例题6-14 Abbott的复仇(Abbott's Revenge)BFS算法实现

Sample Input 3 1 N 3 31 1 WL NR *1 2 WLF NR ER *1 3 NL ER *2 1 SL WR NF *2 2 SL WF ELF *2 3 SFR EL *0 Sample Output (3,1) (2,1) (1,1) (1,2) (2,2) (2,3) (1,3) (1,2) (1,1) (2,1)(2,2) (1,2)...

weixin_30758821的博客 293

POJ - 3070 Fibonacci(快速幂的优化---矩阵快速幂)

题目链接:https://vjudge.net/contest/328717#problem/F 题意: 求斐波那契数列的第n项的最后四位数( 0 ≤ n ≤ 1,000,000,000), 注意对于每个测试用例,打印f[n]的最后四位数字。如果f[n]的最后四位数都是零,则打印“0”;否则,省略任何前导零(即打印f[n] mod 10000)。 引入矩阵的概念: ...

zaiyang遇见 395

UVA 12333 - Revenge of Fibonacci (斐波那契的复仇) by SuCicada

合适的思路 大数加法 字典树 代码 注意点 附录 合适的思路 首先想我们该怎么样能匹配前缀,首先我们不知道完整的数字是什么,所以我们要先得到符合要求的数字数据集。 然后将这些数据集放入字典树中 所以我们要做的就是 使用大数加法技巧,计算前100000个fibonacci 将每一个fibo数存入字典树中 大数加法 首先先做大数加法,使用字符串存储数字,两个字符串(数字)从最后一位即个位...

SuCicada 小米的蝉 740

hdu 5018 Revenge of Fibonacci(水题)

Revenge of Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1135    Accepted Submission(s): 519 Problem Description In mat

TUT我好菜啊 471
上一篇: Fermat Point in Quadrangle POJ 3990 四边形的费马点 数学
下一篇: 算法竞赛入门经典 第二版 例题11-4 电话圈 Calling Circles uva247
Rewriter_huanying
博客等级 码龄10年 12粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值