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\n",a)

#define pi2(a,b)  printf("%d %d\n",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\n",++ca,find_trie(st));

    }

    return 0 ;

}


 

 

你可能感兴趣的:(fibonacci)