Cod sursa(job #2653240)

Utilizator bogdi1bogdan bancuta bogdi1 Data 27 septembrie 2020 13:57:44
Problema Substr Scor 20
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <cstdio>
#include <algorithm>
#include <deque>
using namespace std;
int p[20][17000];
int n;
struct Pereche
{
    int cur,nxt;
};
struct Aux
{
    Pereche pereche;
    int pozitie;
} v[17000];
struct Sortare
{
    int poz,ind;
} srt[17000];
int v2[17000];
struct Minim
{
    int val,ind;
};
deque<Minim> dq;
char s[17000];
bool cmp(const Aux &a, const Aux &b)
{
    if(a.pereche.cur==b.pereche.cur){
        if(a.pereche.nxt==b.pereche.nxt)
            return a.pozitie<b.pozitie;
        return a.pereche.nxt<b.pereche.nxt;
    }
    return a.pereche.cur<b.pereche.cur;
}
bool cmp2(const Sortare &a, const Sortare &b)
{
    return a.poz<b.poz;
}
int lcp(int i,int j)
{
    int l,i1,j1;
    for(l=0,i1=i,j1=j; i1<n && j1<n && s[i1]==s[j1]; i1++,j1++,l++);
    return l;
}
int main()
{   freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);
    int k,i,pw,kk,maxx;
    scanf("%d%d\n", &n, &k);
    if(k==1){
        printf("%d", n);
        return 0;
    }
    scanf("%s", s);
    for(i=0; i<n; i++)
        p[0][i]=s[i]-'a';
    for(kk=1,pw=1; pw/2<n; pw*=2,kk++){
        for(i=0; i<n; i++){
            v[i].pereche={p[kk-1][i], i+pw<n?p[kk-1][i+pw]:-1};
            v[i].pozitie=i;
        }
        sort(v, v+n, cmp);
        for(i=0; i<n; i++){
            if(i>0 && v[i].pereche.cur==v[i-1].pereche.cur && v[i].pereche.nxt==v[i].pereche.nxt)
                p[kk][v[i].pozitie]=p[kk][v[i-1].pozitie];
            else{
                if(i==0)
                    p[kk][v[i].pozitie]=0;
                else
                    p[kk][v[i].pozitie]=i;
            }
        }
    }
    kk--;
    for(i=0; i<n; i++){
        srt[i].poz=p[kk][i];
        srt[i].ind=i;
    }
    sort(srt, srt+n, cmp2);
    for(i=0; i<n-1; i++)
        v2[i]=lcp(srt[i].ind, srt[i+1].ind);
    for(i=0; i<k-1; i++){
        while(!dq.empty() && dq.back().val>v2[i])
            dq.pop_back();
        dq.push_back({v2[i], i});
    }
    maxx=dq.front().val;
    for(; i<n-1; i++){
        while(!dq.empty() && dq.front().ind+k-1<=i)
            dq.pop_front();
        while(!dq.empty() && dq.back().val>v2[i])
            dq.pop_back();
        dq.push_back({v2[i], i});
        maxx=max(maxx, dq.front().val);
    }
    printf("%d", maxx);
    return 0;
}