Cod sursa(job #3369500)

Utilizator stefan_ciureaStefan Ciurea stefan_ciurea Data 20 octombrie 2026 19:08:26
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
// #pragma GCC optimize("O3,unroll-loops,fast-math")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define fi first
#define se second

using namespace std;

const int Nmax=16384+5,inf=1e9,MOD=1e9+7;

int n,k;
string s;
int sa[Nmax],rk[Nmax],temp[Nmax],lcp[Nmax];
int lg;

bool cmp(int a, int b) {
    if (rk[a]!=rk[b]) return rk[a]<rk[b];
    int ra=(a+lg<n ? rk[a+lg]:-1);
    int rb=(b+lg<n ? rk[b+lg]:-1);
    return ra<rb;
}

void build_sa() {
    for (int i=0; i<n; ++i) {
        sa[i]=i;
        rk[i]=s[i];
    }
    lg=1;
    while (1) {
        sort(sa,sa+n,cmp);
        temp[sa[0]]=0;
        for (int i=1; i<n; ++i) temp[sa[i]]=temp[sa[i-1]]+cmp(sa[i-1],sa[i]);
        memcpy(rk,temp,n*sizeof(int));
        if (rk[sa[n-1]]==n-1) break;
        lg<<=1;
    }
}

void build_lcp() {
    int curr=0;
    for (int i=0; i<n; ++i) {
        if (rk[i]==0) continue;
        int j=sa[rk[i]-1];
        while (i+curr<n && j+curr<n && s[i+curr]==s[j+curr]) curr++;
        lcp[rk[i]]=curr;
        if (curr) curr--;
    }
}

int main() {
    ifstream cin("substr.in");
    ofstream cout("substr.out");
    
    cin>>n>>k>>s;
    n=s.size();
    if (k==1) {
        cout<<n;
        return 0;
    }
    build_sa();
    build_lcp();
    int ans=0;
    deque<int> dq;
    for (int i=1; i<n; ++i) {
        while (!dq.empty() && lcp[dq.back()]>=lcp[i]) dq.pop_back();
        dq.push_back(i);
        if (dq.front()<=i-k+1) dq.pop_front();
        if (i>=k-1) ans=max(ans,lcp[dq.front()]);
    }
    cout<<ans;
    
    return 0;
}