Advertisement
aropan

snarknews [SNSS 2012, R3]. E. Fleet of Byteland

Aug 22nd, 2012
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1. #include <cstdio>
  2. #include <map>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <string>
  7.  
  8. template <typename T> T sqr(T x) { return x * x; }
  9. template <typename T> T abs(T x) { return x < 0? -x : x; }
  10.  
  11. using namespace std;
  12.  
  13.  
  14. map <char, string> m;
  15.  
  16. const int MAXN = 107;
  17.  
  18. unsigned long long f[MAXN];
  19. unsigned long long k;
  20. string s;
  21.  
  22. int main()
  23. {
  24.     freopen("fleet.in", "r", stdin);
  25.     freopen("fleet.out", "w", stdout);
  26.     m['A'] = ".-";
  27.     m['E'] = ".";
  28.     m['I'] = "..";
  29.     m['M'] = "--";
  30.     m['Q'] = "--.-";
  31.     m['U'] = "..-";
  32.     m['Y'] = "-.--";
  33.     m['B'] = "-...";
  34.     m['F'] = "..-.";
  35.     m['J'] = ".---";
  36.     m['N'] = "-.";
  37.     m['R'] = ".-.";
  38.     m['V'] = "...-";
  39.     m['Z'] = "--..";
  40.     m['C'] = "-.-.";
  41.     m['G'] = "--.";
  42.     m['K'] = "-.-";
  43.     m['O'] = "---";
  44.     m['S'] = "...";
  45.     m['W'] = ".-- ";
  46.     m['D'] = "-..";
  47.     m['H'] = "....";
  48.     m['L'] = ".-..";
  49.     m['P'] = ".--.";
  50.     m['T'] = "-";
  51.     m['X'] = "-..-";
  52.     cin >> s;
  53.     cin >> k;
  54.     int n = s.size();
  55.     f[n] = 1;
  56.     for (int i = n - 1; i >= 0; i--)
  57.     {
  58.         for (map <char, string> :: iterator iter = m.begin(); iter != m.end(); ++iter)
  59.         {
  60.             string p = iter->second;
  61.             if (n - i >= (int)p.size() && p == s.substr(i, p.size()))
  62.             {
  63.                 f[i] += f[i + p.size()];
  64.                 if (f[i] > k)
  65.                     f[i] = k;
  66.             }
  67.         }
  68.     }
  69.    
  70.     string ans = "";
  71.    
  72.     if (k > f[0])
  73.     {
  74.         cout << "0" << endl;
  75.         return 0;
  76.     }
  77.    
  78.     for (int i = 0; i < n; )
  79.     {
  80.         for (map <char, string> :: iterator iter = m.begin(); iter != m.end(); ++iter)
  81.         {
  82.             char c = iter->first;
  83.             string p = iter->second;
  84.            
  85.             if (n - i >= (int)p.size() && p == s.substr(i, p.size()))
  86.             {
  87.                 if (k <= f[i + p.size()])
  88.                 {
  89.                     ans += c;
  90.                     i += p.size();
  91.                     break;
  92.                 }
  93.                 k -= f[i + p.size()];
  94.             }
  95.         }
  96.     }
  97.     cout << ans << endl;
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement