Cod sursa(job #1174053)

Utilizator omerOmer Cerrahoglu omer Data 21 aprilie 2014 21:00:46
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
const int N=16400, L=17;
using namespace std;
FILE *f,*g;

int suff[L][N]; int step;
char s[N]; int n,k;

struct entry{

    int f,l,p;

    bool operator < (const entry& b) const{

        if (f != b.f) return (f < b.f);
            else return (l < b.l);
    }
} aux[N];

void makesuff(char *s){

    int i; int cnt;
    for(i=1;i<=n;i++) suff[0][i]=s[i]-'a';

    for(step=1,cnt=1; cnt>>1 <= N; step++, cnt<<=1){

        for(i=1;i<=n;i++){
            aux[i].f=suff[step-1][i];
            if (i+cnt <= n) aux[i].l=suff[step-1][i+cnt];
            else aux[i].l=-1;
            aux[i].p=i;
        }
        sort(aux+1,aux+n+1);
        for(i=1;i<=n;i++)
            if (aux[i].f == aux[i-1].f && aux[i].l == aux[i-1].l) suff[step][aux[i].p]=suff[step][aux[i-1].p];
            else suff[step][aux[i].p]=i;
    }
    step--;

}

int lcp (int x, int y){
    
    int k; int ret=0;
    if (x == y) return n-x+1;
    for(k=step ; k>=0 && x<=n && y<=n ; k--)
        if (suff[k][x] == suff[k][y])
            x+=1<<k , y+=1<<k, ret+=1<<k;
    return ret;
}

void read(void){

    f=fopen("substr.in","r");
    g=fopen("substr.out","w");
    fscanf(f,"%d%d%s",&n,&k,s);

    int i;
    for(i=n;i>=1;i--) s[i]=s[i-1];
}

int main(void){

    read();
    makesuff(s);
    
    int maxim=0;
    int i; int l;
    
    for(i=1;i<=n-k+1;i++)
        maxim=max(maxim,lcp(aux[i].p,aux[i+k-1].p));
    fprintf(g,"%d",maxim);
}