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