字典树,数学(Revenge of Fibonacci,hdu 4099)

来源:互联网 发布:在淘宝卖情趣用品 编辑:程序博客网 时间:2024/05/17 21:44

不知到怎么回事,现在网上题解的代码大部分都会MLE。


改成离线算法,就OK了。


#include<bits/stdc++.h>using namespace std;vector<int*>vec;struct Node{    int id;    Node* next[10];    Node()    {        id=-1;        memset(next,0,sizeof(next));    }};Node* root;void add(char str[],int val){    Node* p=root;    int k=0;    while(str[k])    {        int id=str[k++]-'0';        if(!p->next[id]) p->next[id]=new Node;        p=p->next[id];        if(p->id==-1) p->id=val;    }    vec.push_back(&(p->id));}void qry(char str[],int val){    Node* p=root;    int k=0;    while(str[k]&&p->next[str[k]-'0'])    {        if(p->id==-1) p->id=val;        p=p->next[str[k++]-'0'];    }    if(p->id==-1) p->id=val;}string sum(string s1,string s2){    if(s1.length()<s2.length())    {        string temp=s1;        s1=s2;        s2=temp;    }    int i,j;    for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)    {        s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节        if(s1[i]-'0'>=10)        {            s1[i]=char((s1[i]-'0')%10+'0');            if(i) s1[i-1]++;            else s1='1'+s1;        }    }    return s1;}int main(){    root=new Node;    int T;    scanf("%d",&T);    char str[110];    for(int t=1;t<=T;t++)    {        scanf("%s",str);        add(str,-1);    }    string a="1";    string b="1";    str[0]='1';    str[1]=0;    qry(str,0);    for(int i=2;i<1e5;i++)    {        string c=sum(a,b);        a=b;        b=c;        if(a.size()>50||b.size()>50)        {            int cha=max(a.size()-50,b.size()-50);            a.resize(a.size()-cha);            b.resize(b.size()-cha);        }        for(unsigned int j=0;j<b.size();j++)            str[j]=b[j];        str[b.size()]='\0';        str[40]='\0';        qry(str,i);    }    for(unsigned int i=0;i<vec.size();i++)        printf("Case #%d: %d\n",i+1,*vec[i]);    return 0;}


0 0