UVa 12333 - Revenge of Fibonacci (大数 + 字典树)
发布时间:2020-12-14 02:36:24 所属栏目:大数据 来源:网络整理
导读:挺简单的一道字典树,注意计算范围, 如果序号大于等于100000就返回-1。 套用的刘汝佳的大数加法。 #include cstdio#include cstring#include vector#include iostream#include cmath#include cstdlibusing namespace std;struct BigInteger { static const
挺简单的一道字典树,注意计算范围, 如果序号大于等于100000就返回-1。 套用的刘汝佳的大数加法。 #include <cstdio> #include <cstring> #include <vector> #include <iostream> #include <cmath> #include <cstdlib> using namespace std; struct BigInteger { static const int BASE = 100000000; static const int WIDTH = 8; vector<int> s; BigInteger(long long num = 0) { *this = num; } // 构造函数 BigInteger operator = (long long num) { // 赋值运算符 s.clear(); do { s.push_back(num % BASE); num /= BASE; } while(num > 0); return *this; } BigInteger operator = (const string& str) { // 赋值运算符 s.clear(); int x,len = (str.length() - 1) / WIDTH + 1; for(int i = 0; i < len; i++) { int end = str.length() - i*WIDTH; int start = max(0,end - WIDTH); sscanf(str.substr(start,end-start).c_str(),"%d",&x); s.push_back(x); } return *this; } BigInteger operator + (const BigInteger& b) const { BigInteger c; c.s.clear(); for(size_t i = 0,g = 0; ; i++) { if(g == 0 && i >= s.size() && i >= b.s.size()) break; int x = g; if(i < s.size()) x += s[i]; if(i < b.s.size()) x += b.s[i]; c.s.push_back(x % BASE); g = x / BASE; } return c; } }; ostream& operator << (ostream &out,const BigInteger& x) { out << x.s.back(); for(int i = x.s.size()-2; i >= 0; i--) { char buf[20]; sprintf(buf,"%08d",x.s[i]); for(size_t j = 0; j < strlen(buf); j++) out << buf[j]; } return out; } istream& operator >> (istream &in,BigInteger& x) { string s; if(!(in >> s)) return in; x = s; return in; } const int maxn = 10 + 7; const int maxv = 100000; struct DicTree{ int k; DicTree* next[maxn]; }; DicTree *newtree (int id){ DicTree *p; p = new DicTree; p -> k = id; for(int i = 0; i < 10; i++) { p -> next[i] = NULL; } return p; } DicTree *root; void creat(BigInteger x,int id) { int t,tt,d; DicTree *p = root; for(int i = (int) x.s.size() - 1; i >= max(0,(int) x.s.size() - 10); --i) { if(i == (int) x.s.size() - 1) { d = 1; t = log10(x.s[i]); tt = x.s[i]; for(int j = 0; j < t; ++j) { d *= 10; } while(d) { if(p -> next[tt / d]) { p = p -> next[tt / d]; } else { p -> next[tt / d] = newtree(id); p = p -> next[tt / d]; } tt %= d; d /= 10; } } else { d = 10000000; tt = x.s[i]; while(d) { if(p -> next[tt / d]) { p = p -> next[tt / d]; } else { p -> next[tt / d] = newtree(id); p = p -> next[tt / d]; } tt %= d; d /= 10; } } } } int findtree(string s) { DicTree *p = root; for(size_t i = 0; i < s.size(); i++) { if(p -> next[s[i] - '0']) { p = p -> next[s[i] - '0']; } else { return -1; } } return p -> k; } int main() { int T,Case(0); string x; BigInteger a(1),b(1),c(1); root = new DicTree; for(int i = 0; i < 10; i++) { root -> next[i] = NULL; } root -> next[1] = newtree(0); for(int i = 2; i < maxv; i++) { c = a + b; creat(c,i); b = a; a = c; } cin >> T; while(T--) { x.clear(); cin >> x; cout << "Case #" << ++Case << ": " << findtree(x) << endl; } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |