Manioc

max occurrence

Aug 3rd, 2018
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define MAX 250007
  3.  
  4. using namespace std;
  5.  
  6. struct node{
  7.     int next[26];
  8.     int link, len;
  9. } sa[2*MAX];
  10.  
  11. int ans[2*MAX], cnt[2*MAX], radix[2*MAX], dir[2*MAX];
  12. int sz, last, n;
  13.  
  14. char txt[MAX];
  15. void init(){
  16.     sz = 1;
  17.     last = 0;
  18.     sa[0].link = -1;
  19.     sa[0].len = 0;
  20. }
  21.  
  22. void extends(int c){
  23.     int cur = sz++;
  24.     sa[cur].len = sa[last].len + 1;
  25.     dir[cur] = 1;
  26.     for(; last != -1 && !sa[last].next[c]; last = sa[last].link) sa[last].next[c] = cur;
  27.  
  28.     if(last == -1) sa[cur].link = 0;
  29.     else{
  30.         int q = sa[last].next[c];
  31.         if(sa[q].len == sa[last].len + 1) sa[cur].link = q;
  32.         else{
  33.             int clone = sz++;
  34.             sa[clone].len = sa[last].len + 1;
  35.             sa[clone].link = sa[q].link;
  36.             memcpy(sa[clone].next, sa[q].next, sizeof sa[q].next);
  37.             for(; last != -1 && sa[last].next[c] == q; last = sa[last].link) sa[last].next[c] = clone;
  38.             sa[cur].link = sa[q].link = clone;
  39.         }
  40.     }
  41.     last = cur;
  42. }
  43.  
  44. int radixSort(){
  45.     for(int i = 1; i <= sz; i++) cnt[sa[i].len]++;
  46.     for(int i = n; i >= 0; i--) cnt[i] += cnt[i+1];
  47.     for(int i = 1; i <= sz; i++) radix[cnt[sa[i].len]--] = i;
  48. }
  49.  
  50. int main(){
  51.     scanf("%s", txt);
  52.     n = strlen(txt);
  53.     init(); for(int i = 0; i < n; i++) extends(txt[i]-'a');
  54.     radixSort();
  55.     for(int i = 1; i <= sz; i++){
  56.         int now = radix[i];
  57.         dir[sa[now].link] += dir[now];
  58.         ans[sa[now].len] = max(ans[sa[now].len], dir[now]);
  59.     }
  60.     for(int i = n; i > 0; i--) ans[i] = max(ans[i], ans[i+1]);
  61.     for(int i = 1; i <= n; i++) printf("%d\n", ans[i]);
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment