Cod sursa(job #2653857)

Utilizator david.teacaDavid Stefan Teaca david.teaca Data 29 septembrie 2020 13:11:13
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>
 
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
char s[100005];
int n,k,sa[25][17005],Log2[100005],suffix[100005];
pair<pair<int,int>,int> key[100005];
int LCP(int i, int j)
{
    int rez=0;
    int m=n-max(i,j)+1;
    for(int p=Log2[m];p>=0;p--)
    {
        if(sa[p][i]==sa[p][j])
        {
            rez+=(1<<p);
            i+=(1<<p);
            j+=(1<<p);
        }
    }
    return rez;
}
void suffix_array()
{
    for(int i=2;i<=n;i++)
    {
        Log2[i]=1+Log2[i/2];
    }
    for(int i=1;i<=n;i++)
    {
        sa[0][i]=s[i];
    }
    for(int i=1;i<=Log2[n]+1;i++)
    {
        for(int j=1;j<=n;j++)
        {
            key[j]={{sa[i-1][j],sa[i-1][j+(1<<(i-1))]},j};
        }
        sort(key+1,key+n+1);
        int cnt=0;
        for(int j=1;j<=n;j++)
        {
            if(key[j].first!=key[j-1].first)
            {
                ++cnt;
            }
            sa[i][key[j].second]=cnt;
        }
    }
}
int main()
{
    f>>n>>k;
    for(int i=1;i<=n;i++)
    {
        f>>s[i];
    }
    suffix_array();
    for(int i=1;i<=n;i++)
    {
        suffix[sa[Log2[n]+1][i]]=i;
    }
    int Max=0;
    for(int i=1;i<=n;i++)
    {
        Max=max(Max,LCP(suffix[i],suffix[i+k-1]));
    }
    g<<Max<<'\n';
    return 0;
}