Cod sursa(job #918159)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 17:51:20
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
 
#define NMAX 16385
#define LMAX 16
 
struct entry {
    int nr[2],poz;
};
 
struct cmp {
    bool operator () (const entry &a, const entry &b) {
        if(a.nr[0]==b.nr[0])
            return a.nr[1]<b.nr[1];
        return a.nr[0]<b.nr[0];
    }
};
 
entry l[NMAX];
int p[LMAX][NMAX],v[NMAX],n,k,lg;
char s[NMAX+1];
 
void suffix_array()
{
    int i,cnt;
    for(i=1;i<=n;i++)
        p[0][i]=s[i]-47;
    for(cnt=1;(1<<(cnt-1))<=n;cnt++) {
        for(i=1;i<=n;i++) {
            l[i].poz=i;
            l[i].nr[0]=p[cnt-1][i];
            if(i+(1<<(cnt-1))<=n)
                l[i].nr[1]=p[cnt-1][i+(1<<(cnt-1))];
            else l[i].nr[1]=-1;
        }
        sort(l+1,l+n+1,cmp());
        p[cnt][l[1].poz]=1;
        for(i=2;i<=n;i++) {
            p[cnt][l[i].poz]=p[cnt][l[i-1].poz];
            if(l[i].nr[0]!=l[i-1].nr[0] || l[i].nr[1]!=l[i-1].nr[1])
                p[cnt][l[i].poz]++;
        }
    }
    lg=cnt-1;
    for(i=1;i<=n;i++)
        v[p[lg][i]]=i;
}
 
int LCP(int x, int y)
{
    int i,sol;
    sol=0;
    if(x==y)
        return n;
    for(i=lg;i>=0;i--)
        if(p[i][x]==p[i][y]) {
            sol=sol+(1<<i);
            x=x+(1<<i);
            y=y+(1<<i);
            if(x>n || y>n)
                break;
        }
    return sol;
}
 
int main ()
{
    int i,sol;
    ifstream f("substr.in");
    ofstream g("substr.out");
    f>>n>>k;
    f>>(s+1);
    f.close();
    suffix_array();
    sol=0;
    for(i=1;i<=n-k+1;i++)
        sol=max(sol,LCP(v[i],v[i+k-1]));
    g<<sol;
    g.close();
    return 0;
}