Cod sursa(job #3260063)

Utilizator Bianca2507Negret Bianca Bianca2507 Data 29 noiembrie 2024 23:08:29
Problema Substr Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream cin("subst.in");
ofstream cout("subst.out");
struct numar
{
    int poz,nri,nrf;
}l[16400];
int n,k,p[17][16400],power,s[16400],lung;
char c[16400];
int cmp(numar a,numar b)
{
   if(a.nri==b.nri)
        return a.nrf<b.nrf;
    else
        return a.nri<b.nri;

}
int lcp(int x,int y)
{
    if(x==y)
        return n-x;
    int sol=0;
    for(int k=power-1;k>=0 && x<n && y<n;k--)
        if(p[k][x]==p[k][y])
        x+=(1<<k),y+=(1<<k),sol+=(1<<k);
    return sol;
}
int main()
{
    cin>>n>>k>>c;
    for(int i=0;i<n;i++)
        p[0][i]=c[i]-'0';
    for(int lg=1;lg<=n;lg*=2)
    {
        for(int i=0;i<n;i++)
        {
            l[i].poz=i;
            l[i].nri=p[power][i];
            if(i+lg<n)
                l[i].nrf=p[power][i+lg];
            else
                l[i].nrf=-1;
        }
        sort(l,l+n,cmp);
        for(int i=0;i<n;i++)
            if(i>0 && l[i].nri==l[i-1].nri && l[i].nrf==l[i-1].nrf)
            p[power+1][l[i].poz]=p[power+1][l[i-1].poz];
        else
            p[power+1][l[i].poz]=i;
        power++;
    }
    for(int i=0;i<n;i++)
        s[p[power][i]]=i;
    for(int i=0;i+k-1<n;i++)
        lung=max(lung,lcp(s[i],s[i+k-1]));
    cout<<lung;
    return 0;
}