标签:
///1085422276 #include<bits/stdc++.h> using namespace std; typedef long long ll; #define mem(a) memset(a,0,sizeof(a)) #define pb push_back inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){ if(ch==‘-‘)f=-1;ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘){ x=x*10+ch-‘0‘;ch=getchar(); }return x*f; } //**************************************** const int N=100000+50; #define maxn 100000+5 struct Trie{ int ch[N*40][11],sum[N*40],siz; void init() {mem(ch),mem(sum),siz=1;} void insertt(int c[],int index) { int u=0,len=c[0];int cc=0; for(int i=1;i<=min(len,41);i++) { int v=c[i]; if(ch[u][v]==0) { sum[siz] = index; ch[u][v] = siz++; } u=ch[u][v]; } } int aks(int c[]) { int u=0; for(int i=1;i<=c[0];i++) { if(ch[u][c[i]]==0) return -1; u=ch[u][c[i]]; } return sum[u]; } }trie; int a[60],b[60],c[60],d[60]; int main() { mem(a),mem(b),mem(c); trie.init(); a[0]=a[1]=1; trie.insertt(a,0); b[0]=b[1]=1; trie.insertt(b,1); for(int i=2;i<100000;i++) { int len=b[0]; if(len>60) { for(int j=1;j<a[0];j++) a[j]=a[j+1];a[a[0]]=0;a[0]--; for(int j=1;j<b[0];j++) b[j]=b[j+1];b[b[0]]=0;b[0]--; len--; } //for(int j=0;j<100;j++)c[j]=0; len=max(a[0],b[0]); for(int j=1;j<=len;j++) c[j]=a[j]+b[j]; for(int j=1;j<len;j++) if(c[j]>9) c[j+1]++,c[j]=c[j]%10; if(c[len]>9) c[len]%=10,c[len+1]=1,len++; c[0]=len; int h=0; for(int j=c[0];j>=1;j--) d[++h]=c[j]; d[0]=c[0]; trie.insertt(d,i); for(int j=0;j<=b[0];j++) a[j]=b[j]; for(int j=0;j<=c[0];j++) b[j]=c[j]; } int T=read(); int oo=1; while(T--) { char s[60]; scanf("%s",s); int tmp[100]; for(int i=0;i<strlen(s);i++) tmp[i+1]=s[i]-‘0‘; tmp[0]=strlen(s); printf("Case #%d: %d\n",oo++,trie.aks(tmp)); } return 0; }
HDU 4099 Revenge of Fibonacci Trie+高精度
标签:
原文地址:http://www.cnblogs.com/zxhl/p/4982747.html