真不好调,值得注意的一点就是题目说明给出的前缀最多只有四十位,所以我们建立字典树的时候也只取前四十位即可,加和的时候保留60位。
int f[2][MAXN];//滚动数组
char s[55],n[444];
int tot,son[MAXN*43][10];
int mp[MAXN*44];
void build(int k)
{
int p=0,len=strlen(s);
rep(i,len)
{
int c=s[i]-'0';
if(son[p][c]==0) son[p][c]=++tot;
p=son[p][c];
if(mp[p]==0) mp[p]=k+1;
}
}
void init()
{
int low=0,high=1;//最低位最高位
f[0][0]=1,f[1][0]=1;
s[0]='1';s[1]=0;
build(0);
for(int k=2;k<100000;++k)
{
for(int i=low;i<high;++i)
{
f[0][i]+=f[1][i];
if(f[0][i]>=10&&i==high-1) ++high;
f[0][i+1]+=f[0][i]/10;
f[0][i]%=10;
}
if(high-low>60) ++low;
for(int i=low;i<high;++i) swap(f[0][i],f[1][i]);
for(int i=high-1,j=0;i>=low&&j<=40;--i,++j) s[j]=f[1][i]+'0';
build(k);
memset(s,0,sizeof(s));
}
}
int solve()
{
int len=strlen(n);
int p=0,ans=-1;
for(int i=0;i<len;++i)
{
int c=n[i]-'0';
if(son[p][c]) p=son[p][c];
else return -1;
ans=mp[p];
}
return ans-1;
}
signed main()
{
init();
int T;cin>>T;
rpp(_,T)
{
cin>>n;
printf("Case #%d: %d\n",_,solve());
}
return 0;
}