UVA 12333

来源:互联网 发布:highlight.js 用法 编辑:程序博客网 时间:2024/06/03 18:10

字典树比较不错的练习,也是指针的比较不错的练习

#include<bits/stdc++.h>using namespace std;typedef struct node{node* next[10];int id,flag;}T;T *root,N[5000000];int ss = 0;void in(int *num,int l,int id){T *now = root;for(int i = 0;i < l;i++){if(!now->next[num[i]])now->next[num[i]] = &N[ss++];if(!now->id&&!now->flag) now->id = id;now = now->next[num[i]];}if(!now->flag){now->flag = 1;now->id = id;}return ;}int query(int *num,int l){T *now = root;for(int i = 0;i < l;i++){if(!now->next[num[i]])return -1;now = now->next[num[i]];}return now->id;}int num[2][50000] = {0};int sum[50] = {0};int main(){memset(N,0,sizeof(N));root = NULL;root = &N[ss++];int s = 0,l = 1,p,q;num[0][0] = 1;num[1][0] = 1;sum[0] = 1;in(sum,1,0);for(int i = 2;i < 100000;i++){p = i%2;q = (i+1)%2;for(int j = s;j < l;j++)num[p][j] = num[p][j]+num[q][j];for(int j = s;j < l;j++){if(num[p][j]>=10){num[p][j]-=10;num[p][j+1]+=1;}}if(num[p][l])l++;if(l - s > 50) s++;int c = 0,r = l-1;while(r>=0&&c<40)sum[c++] = num[p][r--];in(sum,c,i);}int t;while(cin >> t){for(int i = 1;i <= t;i++){string s;cin >> s;for(int j = 0;j < s.length();j++)sum[j] = s[j] - '0';printf("Case #%d: %d\n",i,query(sum,s.length()));}}return 0;}


0 0
原创粉丝点击