Cod sursa(job #1223575)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 28 august 2014 13:55:31
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#define DIM 16384
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int n,k,stp;
int a[19][DIM];
char A[DIM];

struct suf{
    int st,dr,poz;
}L[DIM];

int cmp(suf a,suf b){
    if(a.st>b.st)
        return 0;
    else if(a.st==b.st)
        if(a.dr>b.dr)
            return 0;
    return 1;
}

int prefix(int x,int y){
    int lenght=0,t=0;
    if(x==y) return n-x;
    for(t=stp;t>=0 && x<n && y<n;t--){
        if(a[t][x]==a[t][y])
            x+=1<<t,y+=1<<t,lenght+=1<<t;
    }
    return lenght;
}

int main(void){
    register int i,j,jv,x,q;

    f>>n>>k;
    f>>A;
    for(i=0;A[i];i++) a[0][i]=A[i]-'a';


    for(i=1;(1<<(i-1))<n;i++){
        for(j=0;j<n;j++){
            L[j].st=a[i-1][j];
            jv=j+(1<<(i-1));
            L[j].dr=(jv<n?a[i-1][jv]:-1);
            L[j].poz=j;
        }
        sort(L,L+n,cmp);
        a[i][L[0].poz]=0,q=0;
        for(j=1;j<n;j++)
            a[i][L[j].poz]=(L[j].st==L[j-1].st && L[j-1].dr==L[j].dr?a[i][L[j-1].poz]:++q);
    }

    stp=i-1;
    int maxim=0;
    for(i=0;i<n-k;i++)
        maxim=max(maxim,prefix(L[i].poz,L[i+k-1].poz));

    g<<maxim;
    f.close();
    g.close();
    return 0;
}