Manioc

lcs sa

Aug 3rd, 2018
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1.     #include <bits/stdc++.h>
  2.     #define MAX 100007
  3.      
  4.     using namespace std;
  5.      
  6.     int mx[2*MAX], mn[2*MAX];
  7.     string palavra;
  8.      
  9.     struct node{
  10.         int next[26];
  11.         int len, link;
  12.     } sa[2*MAX];
  13.      
  14.     int sz, last;
  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.         mn[cur] = sa[cur].len;
  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.                 mn[clone] = sa[clone].len;
  37.                 memcpy(sa[clone].next, sa[q].next, sizeof sa[q].next);
  38.                 for(; last != -1 && sa[last].next[c] == q; last = sa[last].link) sa[last].next[c] = clone;
  39.                 sa[q].link = sa[cur].link = clone;
  40.             }
  41.         }
  42.         last = cur;
  43.     }
  44.      
  45.     void lcs(){
  46.         int v = 0, l = 0;
  47.         for(int i = 0; i <= sz; i++) mx[i] = 0;
  48.         for(int i = 0; i < palavra.size(); i++){
  49.             int id = palavra[i]-'a';
  50.             while(v && !sa[v].next[id]){
  51.                 v = sa[v].link;
  52.                 l = sa[v].len;
  53.             }
  54.      
  55.             if(sa[v].next[id]){
  56.                 v = sa[v].next[id];
  57.                 l++;
  58.             }
  59.             mx[v] = max(mx[v], l);
  60.         }
  61.         //lcs com mais de 1
  62.         for(int i = sz; i > 0; i--) mx[sa[i].link] = max(mx[sa[i].link], mx[i]);
  63.         for(int i = 0; i <= sz; i++) mn[i] = min(mn[i], mx[i]);
  64.     }
  65.      
  66.     void solve(){
  67.         int ans = 0;
  68.         for(int i = 0; i <= sz; i++) ans = max(mn[i], ans);
  69.         cout << ans << endl;
  70.     }
  71.     int main(){
  72.         cin >> palavra;
  73.         init(); for(int i = 0; i < palavra.size(); i++) extends(palavra[i]-'a');
  74.         //int num; cin >> num;
  75.         while(cin >> palavra) lcs();
  76.         solve();
  77.         return 0;
  78.     }
Advertisement
Add Comment
Please, Sign In to add comment