Cod sursa(job #2846665)

Utilizator Savu_Stefan_CatalinSavu Stefan Catalin Savu_Stefan_Catalin Data 9 februarie 2022 14:53:42
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
int n,k,i,j,s[20][100005],sa[100005],ma;
pair<pair<int,int>,int> cnt[100005];
char c;
void norm(int nod)
{
    for (int i=1;i<=n;++i)
        cnt[i].second=i;
    sort(cnt+1,cnt+n+1);
    int cn=0;
    for (int i=1;i<=n;++i)
    {
        if (cnt[i].first!=cnt[i-1].first) cn++;
        s[nod][cnt[i].second]=cn;
    }
}
int lcp(int a,int b)
{
    int rez=0;
    for (int i=16;i>=0;--i)
    {
        if (s[i][a]==s[i][b]) {rez+=(1<<i); a+=(1<<i); b+=(1<<i);}
    }
    return rez;
}
int main()
{
    in>>n>>k;
    for (i=1;i<=n;++i)
        {in>>c; s[0][i]=(int)(c);}
    for (i=1;i<=16;++i)
    {
        for (j=1;j<=n;++j)
            cnt[j].first={s[i-1][j],s[i-1][j+(1<<(i-1))]};
        norm(i);
    }
    for (i=1;i<=n;++i)
    sa[s[16][i]]=i;
    if (k==1) {out<<n; return 0;}
    for (i=1;i<=n-k+1;++i)
    ma=max(ma,lcp(sa[i],sa[i+k-1]));
    out<<ma;
    return 0;
}