Cod sursa(job #529193)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 4 februarie 2011 15:13:54
Problema Substr Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <algorithm>
#define Nmax 16390
#define Maxlg 14
using namespace std;

struct substr{
    int i0,i1,i;
    inline bool operator <( const substr &o ) const{
        return ( i0 == o.i0 ? (i1 < o.i1) : i0<o.i0 );
    }
    inline bool operator ==( const substr &o ) const{
        return ( i0==o.i0 && i1==o.i1 );
    }
} L[Nmax];

int P[Maxlg][Nmax];
char s[Nmax];
int N,K,pmx;

inline int Maxim(int x,int y){ return x>y ? x:y; }
inline int prefix_comun(int a,int b){
    int p,rez=0;
    for(p=pmx; p>=0 && a<N && b<N; --p)
        if( P[p][a] == P[p][b] ){
            a += (1<<p);
            b += (1<<p);
            rez += (1<<p);
        }
    return rez;
}

int main(){
    int i,j,step,rez=0;
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d%d\n",&N,&K);
    fgets(s,Nmax,stdin);

    for(i=0;i<N;++i)
        P[0][i]=s[i]-'a';
    for(pmx=0; (1<<pmx) < N; ) pmx++;
    pmx--;

    for( j=1, step=1<<(j-1); step <N; ++j, step=1<<(j-1) ){
        for(i=0;i<N;++i){
            L[i].i0=P[j-1][i];
            L[i].i1= i+step<N ? P[j-1][i+step] : -1;
            L[i].i=i;
        }
        sort(L,L+N);

        for(i=0;i<N;++i)
            if( i && L[i] == L[i-1] ) P[j][L[i].i]=P[j][L[i-1].i];
            else P[j][L[i].i]=i;
    }

    for(i=0;i<=N-K;++i)
        rez=Maxim(rez, prefix_comun(L[i].i,L[i+K-1].i) );

    printf("%d\n",rez);
    fclose(stdin); fclose(stdout);
    return 0;
}