Cod sursa(job #2845885)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 8 februarie 2022 15:15:05
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int k,n,i,j,ap[256],nr[256],cnt,sa[17][17000],v[17000];
string s;
pair<pair<int,int>,int> cod[17000];
int lcp(int i, int j)
{
    int ans=0;
    for(int k=16;i<=n&&j<=n&&k>=0;k--)
        if(sa[k][i]==sa[k][j])
        {
            ans+=(1<<k);
            i+=(1<<k);
            j+=(1<<k);
        }
    return ans;
}
int rez;
int main()
{
    fin>>n>>k;
    fin>>s;
    s="%"+s;
    for(i=1;i<=n;i++)
        ap[s[i]]=1;
    for(i=0;i<256;i++)
        if(ap[i])
            nr[i]=++cnt;
    for(i=1;i<=n;i++)
        sa[0][i]=nr[s[i]];
    for(i=1;i<=16;i++)
    {
        cnt=0;
        for(j=1;j<=n;j++)
        {
            if(j+(1<<(i-1))<=n)
                cod[j]={{sa[i-1][j],sa[i-1][j+(1<<(i-1))]},j};
            else cod[j]={{sa[i-1][j],0},j};
        }
        sort(cod+1,cod+n+1);
        for(j=1;j<=n;j++)
        {
            if(cod[j].first!=cod[j-1].first)
                cnt++;
            sa[i][cod[j].second]=cnt;
        }
    }
    for(i=1;i<=n;i++)
        v[sa[16][i]]=i;
    for(i=1;i<=n;i++)
    {
        if(i+k-1>n)
            break;
        int tt=min(n,lcp(v[i],v[i+k-1]));
        rez=max(rez,tt);
    }
    fout<<rez<<'\n';
    return 0;
}