Cod sursa(job #1581290)

Utilizator GinguIonutGinguIonut GinguIonut Data 26 ianuarie 2016 18:36:08
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <algorithm>
#define nMax 16389
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int P[23][nMax], n, k, stp, cnt, i, Max, Proc[nMax];
char text[nMax];
struct strct
{
    int nr[2], p;
}L[nMax];
int cmp(const strct &a, const strct &b)
{
    return a.nr[0]==b.nr[0] ? (a.nr[1]<b.nr[1]) : (a.nr[0]<b.nr[0]);
}
void read()
{
    fin>>n>>k;
    fin>>text+1;
}
void sufix_array()
{
    for(i=1;i<=n;i++)
        P[0][i]=text[i]-'a';
    for(stp=1, cnt=1; cnt >> 1 <=n; stp++, cnt <<= 1)
    {
        for(i=1;i<=n;i++)
        {
            L[i].nr[0]=P[stp-1][i];
            L[i].nr[1]=i+cnt<=n ? P[stp-1][i+cnt] : -1;
            L[i].p=i;
        }
        sort(L+1, L+n+1, cmp);
        for(i=1;i<=n;i++)
            P[stp][L[i].p]=i>1 && L[i].nr[0]==L[i-1].nr[0] && L[i].nr[1] == L[i-1].nr[1] ? P[stp][L[i-1].p] : i;
    }
    stp--;
}
int LCP(int x, int y)
{
    int k, ret=0;
    if(x==y)
        return n-x+1;
    for(k=stp;k>=0 && x<=n && y<=n;k--)
        if(P[k][x]==P[k][y])
        {
            ret+= 1 << k;
            x+= 1 << k;
            y+= 1 << k;
        }
    return ret;
}
void solve()
{
    for(i=1;i<=n;i++)
        Proc[P[stp][i]]=i;
    for(i=1;i<=n-k+1;i++)
        Max=max(LCP(Proc[i], Proc[i+k-1]), Max);

}
int main()
{
    read();
    sufix_array();
    solve();
    fout<<Max;
    return 0;
}