Cod sursa(job #2594333)

Utilizator armigheGheorghe Liviu Armand armighe Data 5 aprilie 2020 18:36:55
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.55 kb
#include<fstream>
#include<cstring>
#include<algorithm>
#include<deque>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
char s[16386];
int n,p[16386],pp[16386],lcp[16386],poz[16386],v[16386];
pair<int,int>q[16386],qq[16386];
deque<int>dq;
void sortare()
{
    int i,l,j,k=1;
    for(i=1;i<=n;i++)
        v[(int)s[i]]++;
    for(i=1;i<=255;i++)
        v[i]+=v[i-1];
    for(i=n;i>=1;i--)
        p[v[(int)s[i]]--]=i;
    for(i=1;i<=n;i++)
        poz[p[i]]=i;
    for(i=1;i<=255;i++)
        v[i]=0;
    for(i=1;i<=n;i++)
    {
        q[i].first=k;
        if(s[p[i]]!=s[p[i+1]])
            k++;
    }
    for(l=1;l<n;l*=2)
    {
        for(i=1;i<=n;i++)
        {
            j=p[i]+l;
            if(j>n)
                j=n+1;
            q[i].second=q[poz[j]].first;
        }
        for(i=1;i<=n;i++)
            v[q[i].second]++;
        for(i=1;i<=n;i++)
            v[i]+=v[i-1];
        for(i=n;i>=1;i--)
            pp[v[q[i].second]]=p[i],qq[v[q[i].second]--]=q[i];
        for(i=1;i<=n;i++)
            v[i]=0;
        for(i=1;i<=n;i++)
            v[qq[i].first]++;
        for(i=1;i<=n;i++)
            v[i]+=v[i-1];
        for(i=n;i>=1;i--)
            p[v[qq[i].first]]=pp[i],q[v[qq[i].first]--]=qq[i];
        for(i=1;i<=n;i++)
            poz[p[i]]=i,v[i]=0;
        k=1;
        for(i=1;i<=n;i++)
        {
            if(q[i]==q[i+1])
                q[i].first=k;
            else
                q[i].first=k,k++;
        }
    }
}

void kasai()
{
    int i,x=0,j,i1,i2;
    for(i=1;i<=n;i++)
    {
        x--;
        if(x<0)
            x=0;
        j=poz[i];
        if(j!=n)
        {
            i1=i;
            i2=p[j+1];
            i1+=x;
            i2+=x;
            while(x<n&&i1<=n&&i2<=n&&s[i1]==s[i2])
            {
                x++;
                i1++;
                i2++;
            }
            lcp[j]=x;
        }
        else
            x=0;
    }

}

int main()
{
    int i,sol=0,k;
    f>>n>>k;
    f.get();
    f.getline(s+1,16385);
    while((int)strlen(s+1)!=n)
        f.getline(s+1,16385);
    sortare();
    kasai();
    k--;
    if(k==0)
        sol=n;
    else
    {
        for(i=1;i<=n-1;i++)
        {
            while(!dq.empty()&&lcp[i]<lcp[dq.back()])
                dq.pop_back();
            dq.push_back(i);
            if(dq.front()<=i-k)
                dq.pop_front();
            if(i>=k)
                sol=max(sol,lcp[dq.front()]);
        }
    }
    g<<sol;
    return 0;
}