Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1.  
  2. typedef long long ll;
  3. struct Node
  4. {
  5.     int p, l, r;
  6.     map <char, int> nxt;
  7.     int lnk;
  8.     ll cnt;
  9.     Node(int p = 0, int l = 0, int r = 0) : p(p), l(l), r(r), lnk(-1), cnt(0) {}
  10.     int len()
  11.     {
  12.         return r - l;
  13.     }
  14. };
  15. struct Pos
  16. {
  17.     int v, up;
  18.     Pos(int v = 0, int up = 0) : v(v), up(up) {}
  19. };
  20. const int MAXN = 400500;
  21. const ll MOD = 1e9 + 7;
  22. int sz;
  23. int root;
  24. Node tree[MAXN];
  25. Pos None = Pos(-1, -1);
  26. string s;
  27.  
  28. Pos go(Pos e, char c)
  29. {
  30.     if (e.up == 0)
  31.         return tree[e.v].nxt.count(c) != 0 ? Pos(tree[e.v].nxt[c], tree[tree[e.v].nxt[c]].len() - 1) : None;
  32.     return c == s[tree[e.v].r - e.up] ? Pos(e.v, e.up - 1) : None;
  33. }
  34.  
  35. int add(int p, int l, int r)
  36. {
  37.     tree[sz] = Node(p, l, r);
  38.     tree[p].nxt[s[l]] = sz;
  39.     return sz++;
  40. }
  41.  
  42. int split(Pos e)
  43. {
  44.     if (e.up == 0)
  45.         return e.v;
  46.     int p = tree[e.v].p;
  47.     if (e.up == tree[e.v].len())
  48.         return p;
  49.     int c = add(p, tree[e.v].l, tree[e.v].r - e.up);
  50.     tree[e.v].p = c;
  51.     tree[e.v].l = tree[e.v].r - e.up;
  52.     tree[c].nxt[s[tree[e.v].l]] = e.v;
  53.     return c;
  54. }
  55. int n;
  56.  
  57. Pos jump(int u, int l, int r)
  58. {
  59.     if (l == r)
  60.         return Pos(u, 0);
  61.     while (true)
  62.     {
  63.         u = tree[u].nxt[s[l]];
  64.         if (tree[u].len() >= r - l)
  65.             return Pos(u, tree[u].len() - r + l);
  66.         l += tree[u].len();
  67.     }
  68. }
  69.  
  70. int lnk(int u)
  71. {
  72.     int p = tree[u].p;
  73.     if (tree[u].lnk == -1)
  74.         tree[u].lnk = split(jump(lnk(p), tree[u].l + (p == root), tree[u].r));
  75.     return tree[u].lnk;
  76. }
  77.  
  78. Pos expand(Pos e, int i)
  79. {
  80.     while (true)
  81.     {
  82.         Pos ne = go(e, s[i]);
  83.         if (ne.v != -1)
  84.             return ne;
  85.         int u = split(e);
  86.         add(u, i, n);
  87.         e = Pos(lnk(u), 0);
  88.         if (u == root)
  89.             return e;
  90.     }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement