Advertisement
K_Y_M_bl_C

Untitled

Nov 6th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.73 KB | None | 0 0
  1. vi buildLCP(vi &sa, vi &s, ll &ans, int sz)
  2. {
  3.     int n = s.size();
  4.     vi lcp(n);
  5.     vi pos(n);
  6.     int l = 0;
  7.     for (int i = 0; i < n; ++i)
  8.     {
  9.         pos[sa[i]] = i;
  10.     }
  11.     for (int i = 0; i < n; ++i)
  12.     {
  13.         if (pos[i] == n - 1)
  14.         {
  15.             l = 0;
  16.             continue;
  17.         }
  18.         l = max(l - 1, 0);
  19.         int j = sa[pos[i] + 1];
  20.         while (l < n && s[(i + l) % n] == s[(j + l) % n])
  21.             ++l;
  22.         lcp[pos[i]] = l;
  23.     }
  24.     for (int i = 0; i < sz; ++i)
  25.         ans += lcp[pos[i]];
  26.     return lcp;
  27. }
  28.  
  29. int solve(int n)
  30. {
  31.     vi a(n);
  32.     for (int i = 0; i < n; ++i)
  33.     {
  34.         scanf("%d", &a[i]);
  35.     }
  36.     for (int i = 0; i < n; ++i)
  37.     {
  38.         a.inb(a[i]);
  39.     }
  40.     vi sa = buildSuffArray(a);
  41.     ll ans = 0;
  42.     vi lcp = buildLCP(sa, a, ans, n);
  43.     printf("%lld\n", ans);
  44.     return 0;
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement