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 ; }