Cod sursa(job #3300293)

Utilizator Anul2024Anul2024 Anul2024 Data 14 iunie 2025 16:52:21
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <algorithm>
#include <deque>
#define dim 100000
using namespace std;
ifstream fin ("substr.in");
ofstream fout ("substr.out");
int n,k,e,lg,ord[16][dim+1],p[dim+1],nr[dim+1],v[dim+1];
char s[dim+2];
deque <int> d;
bool cmp (int a,int b)
{
    if (ord[e][a]==ord[e][b])
    {
        a+=lg,b+=lg;
        if (a>=n||b>=n)
            return a>b;
        return ord[e][a]<ord[e][b];
    }
    return ord[e][a]<ord[e][b];
}
void suff ()
{
    for (int i=0; i<n; i++)
    {
        ord[0][i]=s[i]-'a';
        p[i]=i;
    }
    for (e=0; (1<<e)<=n; e++)
    {
        lg=(1<<e);
        sort (p,p+n,cmp);
        for (int i=0; i<n; i++)
            nr[i]=nr[i-1]+cmp (p[i-1],p[i]);
        for (int i=0; i<n; i++)
            ord[e+1][p[i]]=nr[i];
    }
}
void calc_pref ()
{
    for (int i=0; i<n-1; i++)
    {
        int a=p[i],b=p[i+1],sol=0;
        for (int bit=14; bit>=0; bit--)
        {
            if (a+(1<<bit)-1<n&&b+(1<<bit)-1<n&&ord[bit][a]==ord[bit][b])
                sol+=(1<<bit),a+=(1<<bit),b+=(1<<bit);
        }
        v[i]=sol;
    }
}
void solve ()
{
    int sol=0;
    for (int i=0; i<n-1; i++)
    {
        while (!d.empty ()&&v[d.back ()]>=v[i])
            d.pop_back ();
        d.push_back (i);
        if (i>=k-1)
        {
            sol=max (sol,v[d.front ()]);
            if (i-d.front ()+1==k)
                d.pop_front ();
        }
    }
    fout<<sol;
}
int main ()
{
    fin>>n>>k>>s;
    if (k==0)
    {
        fout<<n;
        return 0;
    }
    k--;
    suff ();
    calc_pref ();
    solve ();
    return 0;
}