Cod sursa(job #1638465)

Utilizator arhivamanArhiva Man arhivaman Data 7 martie 2016 23:24:53
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <algorithm>
#define nMax 16400
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int n, k, P[20][nMax], stp, cnt, Max, Proc[nMax];
char S[nMax];
struct sufixe
{
    int nr[2], p;
}L[nMax];
int cmp(const sufixe& a, const sufixe& 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>>S+1;
}
void sufix_array()
{
    for(int i=1;i<=n;i++)
        P[0][i]=S[i]-'a';
    for(stp=1, cnt=1;cnt >> 1<=n;cnt <<= 1, stp++)
    {
        for(int 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(int i=1;i<=n;i++)
            P[stp][L[i].p]= i>0 && 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()
{
    sufix_array();
    for(int i=1;i<=n;i++)
        Proc[P[stp][i]]=i;
    for(int i=1;i<=n-k+1;i++)
        Max=max(Max, LCP(Proc[i], Proc[i+k-1]));
}
void write()
{
    fout<<Max;
}
int main()
{
    read();
    solve();
    write();
    return 0;
}