Tuesday, January 22, 2019

[UVa] 12191 - File Recover

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 12191 - File Recover
Source            : UVA Online Judge
Category          : String
Algorithm         : Suffix Array
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. #define FAST             ios_base::sync_with_stdio(false), cin.tie(nullptr);  
  6.   
  7. #define ll               long long int  
  8.   
  9. static const int maxn = 1e5 + 5;  
  10. static const int logn = 20;  
  11. static const int inf = 12345678;  
  12.   
  13. struct entry  
  14. {  
  15.       int first, second;  
  16.       int p;  
  17.       entry(int ff = 0, int ss = 0, int pp = 0) : first(ff), second(ss), p(pp) {}  
  18.       friend bool operator < (const entry &A, const entry &B)  
  19.       {  
  20.             if (A.first == B.first) return A.second < B.second;  
  21.             return A.first < B.first;  
  22.       }  
  23. } L[maxn];  
  24.   
  25. int P[logn][maxn], B[maxn];  
  26. int p, q;  
  27. int step, lcp[maxn];  
  28.   
  29. inline int comp2(const int &a, const int &b)  
  30. {  
  31.       return P[step-1][a] < P[step-1][b];  
  32. }  
  33.   
  34. inline void suffixArray(const string &s)  
  35. {  
  36.       int len = s.size();  
  37.       for (int i = 0; i < len; i++) P[0][i] = s[i] - '0';  
  38.       step = 1;  
  39.       int cnt = 1;  
  40.       for ( ; cnt>>1 < len; step++, cnt <<= 1)  
  41.       {  
  42.             for (int i = 0; i < len; i++)  
  43.             {  
  44.                   L[i].first = P[step-1][i];  
  45.                   L[i].second = (i + cnt) < len ? P[step-1][i+cnt] : -1;  
  46.                   L[i].p = i;  
  47.             }  
  48.             sort(L, L+len);  
  49.             for (int i = 0; i < len; i++)  
  50.             {  
  51.                   if (i > 0 && L[i].first == L[i-1].first && L[i].second == L[i-1].second)  
  52.                         P[step][ L[i].p ] = P[step][ L[i-1].p ];  
  53.                   else  
  54.                         P[step][ L[i].p ] = i;  
  55.             }  
  56.       }  
  57.       for (int i = 0; i < len; i++) B[i] = i;  
  58.       sort(B, B+len, comp2);    
  59. }  
  60.   
  61. inline void LCP(const string &s)  
  62. {  
  63.       int len = s.size();  
  64.       memset(lcp, 0, sizeof lcp);  
  65.       for (int i = 1; i < len; i++)  
  66.       {  
  67.             int x = B[i];  
  68.             int y = B[i-1];  
  69.             for (int k = step-1; k >= 0 && x < len && y < len; k--)  
  70.             {  
  71.                   if (P[k][x] == P[k][y])  
  72.                   {  
  73.                         lcp[i] += (1 << k);  
  74.                         x += (1 << k);  
  75.                         y += (1 << k);  
  76.                   }  
  77.             }  
  78.       }  
  79. }  
  80.   
  81.   
  82. int main()  
  83. {  
  84.       FAST;  
  85.   
  86.       string s;  
  87.       while (cin >> s)  
  88.       {  
  89.             if (s[0] == '*'break;  
  90.             int len = s.size();  
  91.             suffixArray(s);  
  92.             LCP(s);  
  93.             ll ans = 0;  
  94.             for (int i = 1; i < len; i++)  
  95.             {  
  96.                   if (lcp[i] >= lcp[i-1]) ans += (lcp[i] - lcp[i-1]);  
  97.             }  
  98.             cout << ans << endl;  
  99.       }  
  100. }  


No comments:

Post a Comment

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