• HDU 4099 Revenge of Fibonacci (数学+字典数)


    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4099

    这个题目就是一个坑或。

    题意:给你不超过40的一串数字,问你这串数字是Fibonacci多少的开头几位数字,如果不存在则输出-1.

    题解:明明说好的不超过40,但是在建字典数的时候不加i<41就超内存了,杭电你是想咋地,害的我比较好多人的代码,一点一点试出来的。

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <vector>
    #include <list>
    #include <deque>
    #include <queue>
    #include <iterator>
    #include <stack>
    #include <map>
    #include <set>
    #include <algorithm>
    #include <cctype>
    using namespace std;
    
    #define si1(a) scanf("%d",&a)
    #define si2(a,b) scanf("%d%d",&a,&b)
    #define sd1(a) scanf("%lf",&a)
    #define sd2(a,b) scanf("%lf%lf",&a,&b)
    #define ss1(s)  scanf("%s",s)
    #define pi1(a)    printf("%d
    ",a)
    #define pi2(a,b)  printf("%d %d
    ",a,b)
    #define mset(a,b)   memset(a,b,sizeof(a))
    #define forb(i,a,b)   for(int i=a;i<b;i++)
    #define ford(i,a,b)   for(int i=a;i<=b;i++)
    
    typedef __int64 LL;
    const int N=10;
    const int INF=0x3f3f3f3f;
    const double PI=acos(-1.0);
    const double eps=1e-7;
    
    char str[4][100];
    
    struct Trie
    {
        int v;
        Trie *next[N];
        Trie()
        {
            v=-1;
            for(int i=0;i<N;i++)
                next[i]=NULL;
        }
    }*root;
    
    void creat_trie(char s[],int x)
    {
        int len=strlen(s);
        Trie *p=root;
        for(int i=0;i<len&&i<41;i++)//这个地方太肯爹了,明明说好的不超过40,不加i<41就超内存了,杭电你是想咋地
        {
            int id=s[i]-'0';
            if(p->next[id]==NULL)
                p->next[id]=new Trie();
            p=p->next[id];
            if(p->v<0)
                p->v=x;
        }
    }
    
    void add(char a[],char b[],char c[])
    {
        int lena=strlen(a)-1,lenb=strlen(b)-1;
        int k=0,up=0;
        int x,y,z;
        while(lena>=0||lenb>=0)
        {
            if(lena<0) x=0;
            else x=a[lena]-'0';
    
            if(lenb<0)  y=0;
            else y=b[lenb]-'0';
            z=x+y+up;
            c[k++]=z%10+'0';
            up=z/10;
            lena--;
            lenb--;
        }
        if(up>0)    c[k++]=up+'0';
        c[k]=0;
        for(int i=0;i<k/2;i++)
            swap(c[i],c[k-i-1]);
    //    cout<<k<<" "<<c<<endl;system("pause");
    }
    
    int find_trie(char st[])
    {
        Trie *p=root;
        int len=strlen(st);
        int tmp;
        for(int i=0;i<len;i++)
        {
            int id=st[i]-'0';
            if(p->next[id]==NULL)
                return -1;
            else
            {
                p=p->next[id];
                tmp=p->v;
            }
        }
        return tmp;
    }
    
    void init()
    {
        str[1][0]='1';  str[1][1]=0;
        creat_trie(str[1],0);
        str[2][0]='1';  str[2][1]=0;
        creat_trie(str[2],1);
        for(int i=2;i<100000;i++)//注意题目是小于,不能取等号。。
        {
            int len1=strlen(str[1]);
            int len2=strlen(str[2]);
            if(len2>60)//舍去地位
            {
                str[2][len2-1]=0;
                str[1][len1-1]=0;
            }
            add(str[1],str[2],str[3]);
    
            creat_trie(str[3],i);
            strcpy(str[1],str[2]);
            strcpy(str[2],str[3]);
        }
    }
    
    int main()
    {
    //    freopen("input.txt","r",stdin);
        root=new Trie();
        init();
        int T,ca=0;
        char st[66];
        si1(T);
        while(T--)
        {
            ss1(st);
            printf("Case #%d: %d
    ",++ca,find_trie(st));
        }
        return 0 ;
    }
    


     

  • 相关阅读:
    JZOJ 100019.A
    idea突然无法智能提示了
    C基于 postgresql-devel 连接postgresql 数据库,实现增删改查的代码封装
    gcc 编译第三方库
    C 语言中的指针函数写法
    java 基于RXTX配置linux和window串口
    springboot 在windows 中打jar包运行正常, 但是在linux 环境中报错 加载不到主类
    求4 的余数
    win10 定时重启某个程序
    win10 使用ssh远程 linux机器并修改了hostname, 然后重新连接的时候连接不上, 但是其它机器可以远程上
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3343540.html
Copyright © 2020-2023  润新知