傳送門: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 ;}