15 1 12 123 1234 12345 9 98 987 9876 98765 89 32 51075176167176176176 347746739 5610
Case #1: 0 Case #2: 25 Case #3: 226 Case #4: 1628 Case #5: 49516 Case #6: 15 Case #7: 15 Case #8: 15 Case #9: 43764 Case #10: 49750 Case #11: 10 Case #12: 51 Case #13: -1 Case #14: 1233 Case #15: 22374
#include<cstring> #include<iostream> #include<cstdlib> #include<cstdio> #include<string> #include<algorithm> #define N 100005 using namespace std; int n; char s[50],a[60],b[60],c[60]; struct Trie { int id; struct Trie *Next[10]; Trie() { id=-1; for(int i=0; i<10; i++) { Next[i]=NULL; } } }; Trie *p; void Trie_Inser(Trie *p,char s[],int id) { int i=0; Trie *q=p; while(s[i]&&i<41) { int nx=s[i]-48; if(q->Next[nx]==NULL) { q->Next[nx]=new Trie; } q=q->Next[nx]; if(q->id==-1) { q->id=id; } i++; } } void Add() { int la=strlen(a); int lb=strlen(b); int res[100]; int l=0; la--,lb--; int t=0; while(la>=0) { res[l]=(a[la]-48)+(b[lb]-48)+t; t=0; if(res[l]>=10) { res[l]-=10; t=1; } la--; lb--; l++; } while(lb>=0) { res[l]=b[lb]-48+t; t=0; if(res[l]>=10) { res[l]-=10; t=1; } lb--,l++; } if(t) { res[l++]=1; } int i=0; int k=0; if(l>50) { k=l-50; } l--; while(l>=0&&i<50) { c[i++]=res[l--]+48; } c[i]='\0'; lb=strlen(b); int lc=strlen(c); for(int j=0; j<lb-k; j++) { a[j]=b[j]; } a[lb-k]='\0'; for(int j=0; j<lc; j++) { b[j]=c[j]; } b[lc]='\0'; } void Init() { p=new Trie; a[0]='1',a[1]='\0'; Trie_Inser(p,a,0); b[0]='1',b[1]='\0'; for(int i=2; i<100000; i++) { Add(); Trie_Inser(p,c,i); } } int Trie_Serch(Trie *p,char s[]) { int i=0; Trie *q=p; while(s[i]) { int nx=s[i]-48; if(q->Next[nx]==NULL)return -1; q=q->Next[nx]; i++; } return q->id; } int main() { //freopen("test.in","r",stdin); Init(); int t; cin>>t; int ca=1; while(t--) { scanf("%s",s); printf("Case #%d: %d\n",ca++,Trie_Serch(p,s)); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 4099 Revenge of Fibonacci(字典树)
原文:http://blog.csdn.net/acm_baihuzi/article/details/46919505