Cod sursa(job #2652715)

Utilizator PredescuSebastianIonPredescu Sebastian Ion PredescuSebastianIon Data 25 septembrie 2020 16:21:30
Problema Substr Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int n,k,mat[25][17005],v[10005],sufix[100005];
char sir[100005];
pair<pair<int,int>,int> cheie[10005];
int lcp(int i,int j)
{
    int rez=0,m=n-max(i,j)+1;
    for(int p=v[m];p>=0;p--)
    {
        if(mat[p][i]==mat[p][j])
        {
            rez+=(1<<p);
            i+=(1<<p);
            j+=(1<<p);
        }
    }
    return rez;
}
void sufix_array()
{
    for(int i=2;i<=n;i++)
    {
        v[i]=1+v[i/2];
    }
    for(int i=1;i<=n;i++)
    {
        mat[0][i]=sir[i];
    }
    for(int i=1;i<=v[n]+1;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cheie[j]={{mat[i-1][j],mat[i-1][j+(1<<(i-1))]},j};
        }
        sort(cheie+1,cheie+n+1);
        int nr=0;
        for(int j=1;j<=n;j++)
        {
            if(cheie[j].first!=cheie[j-1].first)
            {
                ++nr;
            }
            mat[i][cheie[j].second]=nr;
        }
    }
}
int main()
{
    f>>n>>k;
    if(k==1)
    {
        g<<n<<'\n';
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        f>>sir[i];
    }
    sufix_array();
    for(int i=1;i<=n;i++)
    {
        sufix[mat[v[n]+1][i]]=i;
    }
    int Max=0;
    for(int i=1;i<=n;i++)
    {
        Max=max(Max,lcp(sufix[i],sufix[i+k-1]));
    }
    g<<Max<<'\n';
    return 0;
}