Cod sursa(job #3258944)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 24 noiembrie 2024 13:31:44
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");

const int nmax = 16384;

int n,k;

struct Sufel
{
    int nr[2];
    int p;
} l[nmax + 5];

int r[17][nmax + 5];

string s;

int bp;

void precompute()
{
    for(int i = 1; i<=n; i++)
        r[0][i] = s[i]-'a'+1;
    for(int i=1; (1<<i)<=n; i++)
    {
        bp=i;
        for(int j=1; j<=n; j++)
        {
            l[j].nr[0]=r[i-1][j];
            l[j].nr[1]=-1;
            if(j + (1<<(i-1)) <=n)
                l[j].nr[1] = r[i-1][j+(1<<(i-1))];
            l[j].p = j;
        }
        sort(l+1,l+n+1,[](const Sufel& a,const Sufel& b)
        {
            if(a.nr[0]==b.nr[0])
                return a.nr[1]<b.nr[1];
            return a.nr[0]<b.nr[0];
        });
        for(int j=1;j<=n;j++){
            r[i][l[j].p] = j;
            if(j>1 && l[j].nr[0] == l[j-1].nr[0] && l[j].nr[1]==l[j-1].nr[1])
                r[i][l[j].p] = r[i][l[j-1].p];
        }
    }
    /*
    for(int i=0;(1<<i)<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            fout<<r[i][j]<<' ';
        }
        fout<<'\n';
    }*/

}

int lcp(int x,int y)
{
    int sl = 0;
    if(x==y)
        return n-x+1;
    for(int i = bp;i>=0 && x <=n && y <=n;i--)
    {
        if(r[i][x]==r[i][y])
            x+=(1<<i),y+=(1<<i),sl+=(1<<i);
    }
    return sl;
}






int main()
{
    fin>>n>>k;
    fin>>s;
    s='#' + s;
    precompute();
    int mx = 0;
    for(int i=1;i+k-1<=n;i++)
    {
        int x = lcp(l[i].p,l[i+k-1].p);
        mx=max(x,mx);
    }
    fout<<mx;

}