Cod sursa(job #1716590)

Utilizator DjokValeriu Motroi Djok Data 13 iunie 2016 09:52:16
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct state {
    int len,link,cnt;
    map<char,int> next;
}State;

int i,n,k,sz,last,rs;
string s;
vector<int> lens[33000];
State sa[33000];

void add_letter(char c) {
    int now=sz++,p;

    sa[now].len=sa[last].len+1;
    sa[now].cnt=1;

    lens[sa[now].len].push_back(now);

    for(p=last;p!=-1 && !sa[p].next.count(c);p=sa[p].link) sa[p].next[c]=now;

    if(p==-1) sa[now].link=0;
    else {
           int q=sa[p].next[c];

           if(sa[q].len==sa[p].len+1) sa[now].link=q;
           else {
                  int clone=sz++;

                  sa[clone].next=sa[q].next;
                  sa[clone].link=sa[q].link;
                  sa[clone].len=sa[p].len+1;
                  sa[clone].cnt=0;

                  for(;p!=-1 && sa[p].next[c]==q;p=sa[p].link) sa[p].next[c]=clone;

                  sa[q].link=sa[now].link=clone;
                  lens[sa[clone].len].push_back(clone);
                }
         }

    last=now;
}

int main()
{
  ifstream cin("substr.in");
  ofstream cout("substr.out");

  ios_base::sync_with_stdio(0);

  cin>>n>>k>>s;

  sz=1; sa[0].link=-1;

  for(i=0;i<n;++i) add_letter(s[i]);

  for(i=n;i;--i)
   for(auto it:lens[i])
   sa[sa[it].link].cnt+=sa[it].cnt;

  for(i=1;i<sz;++i) if(sa[i].cnt>=k) rs=max(rs,sa[i].len);

  cout<<rs<<'\n';

 return 0;
}