Advertisement
Guest User

Untitled

a guest
Dec 1st, 2015
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <cstdio>
  7. #include <ctime>
  8. #include <set>
  9.  
  10. using namespace std;
  11.  
  12. #define ll long long
  13. #define ld long double
  14.  
  15. const int N = (int)5e5 + 40;
  16. const int INF = 1e9 + 7;
  17. const ld EPS = 1e-7;
  18. const int LOG = 50;
  19.  
  20. struct node{
  21.     node *to[30], *link;
  22.     ll an;
  23.     int len;
  24. };
  25.  
  26. void cpy(node * a, node * b){
  27.     a->link = b->link;
  28.     a->an = 0;
  29.     for (int i = 0; i < 27; i++)
  30.         a->to[i] = b->to[i];
  31. }
  32.  
  33. node tree[N], d[5];
  34. char s[N];
  35. int msiz;
  36.  
  37. node *add(node *last, int x){
  38.     node * cur = tree + msiz++;
  39.     cur->len = last->len + 1, cur->an = 0, cur->link = tree;
  40.     for (int i = 0; i < 27; i++)
  41.         cur->to[i] = NULL;
  42.     node * v = last;
  43.     while (1){
  44.         if (v->to[x] == NULL){
  45.             v->to[x] = cur;
  46.             cur->an += v->an;  //
  47.         }
  48.         else{
  49.             node *q = v->to[x];
  50.             if (v->len + 1 == q->len){
  51.                 cur->link = q;
  52.                 return cur;
  53.             }
  54.             node *clone = tree + msiz++;
  55.             cpy(clone, q);
  56.             clone->len = v->len + 1;
  57.             cur->link = clone;
  58.             q->link = clone;
  59.             while (1){
  60.                 if (v->to[x] == q){
  61.                     q->an -= v->an;   //
  62.                     clone->an += v->an;
  63.                     v->to[x] = clone;
  64.                 }
  65.                 else{
  66.                     break;
  67.                 }
  68.                 if (v->link == NULL)
  69.                     break;
  70.                 v = v->link;
  71.             }
  72.             return cur;
  73.         }
  74.         if (v->link == NULL){
  75.             cur->link = tree;
  76.             return cur;
  77.         }
  78.         v = v->link;
  79.     }
  80.     return cur;
  81. }
  82.  
  83. int main()
  84. {
  85.     freopen("keepcounted.in", "r", stdin);
  86.     freopen("keepcounted.out", "w", stdout);
  87.     gets(s);
  88.     ll ans = 0;
  89.     int n = strlen(s);
  90.     node *last = tree + msiz++;
  91.     last->len = 0, last->link = NULL, last->an = 1;
  92.     for (int i = 0; i < 27; i++)
  93.         last->to[i] = NULL;
  94.     for (int i = 0; i < n; i++){
  95.         last = add(last, (int)(s[i] - 'a'));
  96.         ans += last->an;
  97.         cout << ans << endl;
  98.     }
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement