Monday, September 9, 2019

[Codeforces] B. String

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : B. String
Source            : Codeforces
Category          : String
Algorithm         : Suffix Automaton, kth lexicographical substring
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 2e5 + 5;  
  6.   
  7. struct State  
  8. {  
  9.       int len;  
  10.       int link;  
  11.       long long occ;  
  12.       long long word;  
  13.       map <charint> Next;  
  14.   
  15.       State() {}  
  16.       void clean()  
  17.       {  
  18.             len = 0;  
  19.             link = -1;  
  20.             occ = 0;  
  21.             word = 0;  
  22.             Next.clear();  
  23.       }  
  24. } st[maxn * 2];  
  25.   
  26. int sz;  
  27. int last;  
  28.   
  29. void init()  
  30. {  
  31.       sz = 0;  
  32.       last = 0;  
  33.       for (int i = 0; i < maxn * 2; i++) st[i].clean();  
  34.       sz++;  
  35. }  
  36.   
  37. void SAM(char ch)  
  38. {  
  39.       int cur = sz++;  
  40.       st[cur].len = st[last].len + 1;  
  41.       int p;  
  42.       for (p = last; p != -1 && !st[p].Next.count(ch); p = st[p].link)  
  43.       {  
  44.             st[p].Next[ch] = cur;  
  45.       }  
  46.       if (p == -1)  
  47.       {  
  48.             st[cur].link = 0;  
  49.       }  
  50.       else  
  51.       {  
  52.             int q = st[p].Next[ch];  
  53.             if (st[p].len + 1 == st[q].len)  
  54.             {  
  55.                   st[cur].link = q;  
  56.             }  
  57.             else  
  58.             {  
  59.                   int clone = sz++;  
  60.                   st[clone].len = st[p].len + 1;  
  61.                   st[clone].Next = st[q].Next;  
  62.                   st[clone].link = st[q].link;  
  63.                   for ( ; p != -1 && st[p].Next[ch] == q; p = st[p].link)  
  64.                   {  
  65.                         st[p].Next[ch] = clone;  
  66.                   }  
  67.                   st[q].link = st[cur].link = clone;  
  68.             }  
  69.       }  
  70.       last = cur;  
  71. }  
  72.   
  73. void allTerminal()  
  74. {  
  75.       int cur = last;  
  76.       while (cur > 0)  
  77.       {  
  78.             st[cur].occ += 1;  
  79.             cur = st[cur].link;  
  80.       }  
  81. }  
  82.   
  83. void dfs(int u = 0)  
  84. {  
  85.       if (st[u].word) return;  
  86.       for (auto it : st[u].Next)  
  87.       {  
  88.             int v = it.second;  
  89.             dfs(v);  
  90.             st[u].occ += st[v].occ;  
  91.             st[u].word += st[v].word;  
  92.       }  
  93.       st[u].word += st[u].occ;  
  94. }  
  95.   
  96. void kthLex(int u, int k, string &s)  
  97. {  
  98.       if (k <= 0) return;  
  99.       for (auto it : st[u].Next)  
  100.       {  
  101.             int v = it.second;  
  102.             if (st[v].word >= k)  
  103.             {  
  104.                   s.push_back(it.first);  
  105.                   return void(kthLex(v, k - st[v].occ, s));  
  106.             }  
  107.             else  
  108.             {  
  109.                   k -= st[v].word;  
  110.             }  
  111.       }  
  112. }  
  113.   
  114. int main()  
  115. {  
  116.       ios_base::sync_with_stdio(false);  
  117.       cin.tie(nullptr);  
  118.       cout.tie(nullptr);  
  119.   
  120.       #ifndef ONLINE_JUDGE  
  121.             freopen("in.txt""r", stdin);  
  122.       #endif // ONLINE_JUDGE  
  123.   
  124.       string s;  
  125.       int k;  
  126.       cin >> s >> k;  
  127.       init();  
  128.       for (char ch : s) SAM(ch);  
  129.       allTerminal();  
  130.       dfs();  
  131.       string ans;  
  132.       kthLex(0, k, ans);  
  133.       if (ans.empty()) ans = "No such line.";  
  134.       cout << ans << endl;  
  135. }  

No comments:

Post a Comment

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