Monday, January 21, 2019

[UVa] 12333 - Revenge of Fibonacci

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 12333 - Revenge of Fibonacci
Source            : UVA Online Judge
Category          : Large Fibonacci Number
Algorithm         : Trie
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define sz(a)            (int)a.size()  
  6.   
  7. struct Trie  
  8. {  
  9.       int endd;  
  10.       Trie *child[10];  
  11.       Trie()  
  12.       {  
  13.             endd = -1;  
  14.             for (int i = 0; i < 10; i++) child[i] = nullptr;  
  15.       }  
  16.       ~Trie()  
  17.       {  
  18.             for (int i = 0; i < 10; i++)  
  19.             {  
  20.                   if (child[i] && child[i] != thisdelete child[i];  
  21.             }  
  22.       }  
  23. };  
  24.   
  25. typedef Trie*         pnode;  
  26.   
  27. pnode root;  
  28.   
  29. inline void Insert(const string &s, int fibo)  
  30. {  
  31.       pnode cur = root;  
  32.       int len = sz(s);  
  33.       for (int i = 0; i < min(len, 43); i++)  
  34.       {  
  35.             int val = s[i] - '0';  
  36.             if (cur->child[val] == nullptr) cur->child[val] = new Trie();  
  37.             cur = cur->child[val];  
  38.             if (cur->endd == -1) cur->endd = fibo;  
  39.       }  
  40. }  
  41.   
  42. inline int Search(const string &s)  
  43. {  
  44.       pnode cur = root;  
  45.       int len = sz(s);  
  46.       for (int i = 0; i < len; i++)  
  47.       {  
  48.             int val = s[i] - '0';  
  49.             if (cur->child[val] == nullptr) return -1;  
  50.             cur = cur->child[val];  
  51.       }  
  52.       return cur->endd;  
  53. }  
  54.   
  55. inline int toInt(char ch)  
  56. {  
  57.       return (int)(ch - '0');  
  58. }  
  59.   
  60. inline string add(string a, string b)  
  61. {  
  62.       while (sz(a) < sz(b)) a = "0" + a;  
  63.       while (sz(b) < sz(a)) b = "0" + b;  
  64.       string res = "";  
  65.       int carry = 0;  
  66.       for (int i = sz(a) - 1; i >= 0; i--)  
  67.       {  
  68.             int sum = toInt(a[i]) + toInt(b[i]) + carry;  
  69.             carry = 0;  
  70.             if (sum > 9)  
  71.             {  
  72.                   carry++;  
  73.                   sum -= 10;  
  74.                   res += (char)(sum + '0');  
  75.             }  
  76.             else  
  77.             {  
  78.                   res += (char)(sum + '0');  
  79.             }  
  80.       }  
  81.       if (carry) res += "1";  
  82.       reverse(res.begin(), res.end());  
  83.       while (*res.begin() == '0') res.erase(res.begin());  
  84.       return res;  
  85. }  
  86.   
  87. inline void fibo_calc()  
  88. {  
  89.       string a = "1";  
  90.       string b = "1";  
  91.       Insert(a, 0);  
  92.       for (int i = 2; i < 100000; i++)  
  93.       {  
  94.             string fn = add(a, b);  
  95.             Insert(fn, i);  
  96.             a = b;  
  97.             b = fn;  
  98.       }  
  99. }  
  100.   
  101.   
  102. int main()  
  103. {  
  104.       ios_base::sync_with_stdio(false);  
  105.       cin.tie(nullptr);  
  106.   
  107.       root = new Trie();  
  108.       fibo_calc();  
  109.       int tc;  
  110.       cin >> tc;  
  111.       for (int tcase = 1; tcase <= tc; tcase++)  
  112.       {  
  113.             string s;  
  114.             cin >> s;  
  115.             cout << "Case #" << tcase << ": " << Search(s) << endl;  
  116.       }  
  117. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.