Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 100007
- using namespace std;
- int mx[2*MAX], mn[2*MAX];
- string palavra;
- struct node{
- int next[26];
- int len, link;
- } sa[2*MAX];
- int sz, last;
- void init(){
- sz = 1;
- last = 0;
- sa[0].link = -1;
- sa[0].len = 0;
- }
- void extends(int c){
- int cur = sz++;
- sa[cur].len = sa[last].len + 1;
- mn[cur] = sa[cur].len;
- for(; last != -1 && !sa[last].next[c]; last = sa[last].link) sa[last].next[c] = cur;
- if(last == -1) sa[cur].link = 0;
- else{
- int q = sa[last].next[c];
- if(sa[q].len == sa[last].len + 1) sa[cur].link = q;
- else{
- int clone = sz++;
- sa[clone].len = sa[last].len + 1;
- sa[clone].link = sa[q].link;
- mn[clone] = sa[clone].len;
- memcpy(sa[clone].next, sa[q].next, sizeof sa[q].next);
- for(; last != -1 && sa[last].next[c] == q; last = sa[last].link) sa[last].next[c] = clone;
- sa[q].link = sa[cur].link = clone;
- }
- }
- last = cur;
- }
- void lcs(){
- int v = 0, l = 0;
- for(int i = 0; i <= sz; i++) mx[i] = 0;
- for(int i = 0; i < palavra.size(); i++){
- int id = palavra[i]-'a';
- while(v && !sa[v].next[id]){
- v = sa[v].link;
- l = sa[v].len;
- }
- if(sa[v].next[id]){
- v = sa[v].next[id];
- l++;
- }
- mx[v] = max(mx[v], l);
- }
- //lcs com mais de 1
- for(int i = sz; i > 0; i--) mx[sa[i].link] = max(mx[sa[i].link], mx[i]);
- for(int i = 0; i <= sz; i++) mn[i] = min(mn[i], mx[i]);
- }
- void solve(){
- int ans = 0;
- for(int i = 0; i <= sz; i++) ans = max(mn[i], ans);
- cout << ans << endl;
- }
- int main(){
- cin >> palavra;
- init(); for(int i = 0; i < palavra.size(); i++) extends(palavra[i]-'a');
- //int num; cin >> num;
- while(cin >> palavra) lcs();
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment