Cod sursa(job #1223326)

Utilizator acomAndrei Comaneci acom Data 27 august 2014 16:31:56
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
struct entry
{
    int st,dr,poz;
} Q[16400];
char s[16400];
int n,k,minim,maxim,stp,poz[16400],P[16][16400];
bool cmp(entry A, entry B)
{
    if (A.st==B.st)
        return (A.dr<B.dr);
    return (A.st<B.st);
}
int lcp(int x, int y)
{
    int i,r=0;
    if (x==y) return n-x;
    for (i=stp;i>=0 && x<n && y<n;--i)
        if (P[i][x]==P[i][y])
            x+=1<<i, y+=1<<i, r+=1<<i;
    return r;
}
int main()
{
    int i,j;
    fin>>n>>k>>s;
    minim=s[0];
    for (i=1;s[i];++i)
        if (s[i]<minim) minim=s[i];
    for (i=0;i<n;++i)
        P[0][i]=s[i]-minim;
    for (i=1;(1<<(i-1))<n;++i)
    {
        for (j=0;j<n;++j)
        {
            Q[j].st=P[i-1][j], Q[j].dr=0;
            if (j+(1<<(i-1))<n) Q[j].dr=P[i-1][j+(1<<(i-1))];
            Q[j].poz=j;
        }
        sort(Q,Q+n,cmp);
        P[i][Q[0].poz]=0;
        for (j=1;j<n;++j)
            if (Q[j].st==Q[j-1].st && Q[j].dr==Q[j-1].dr)
                P[i][Q[j].poz]=P[i][Q[j-1].poz];
            else
                P[i][Q[j].poz]=1+P[i][Q[j-1].poz];
    }
    stp=i-1;
    for (i=0;i<n;++i)
        poz[i]=Q[i].poz;
    for (i=0;i+k<=n;++i)
        maxim=max(maxim,lcp(poz[i],poz[i+k-1]));
    fout<<maxim<<"\n";
    return 0;
}