Cod sursa(job #1477910)

Utilizator SilviuIIon Silviu SilviuI Data 27 august 2015 13:06:33
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>
#include <cstring>
#include <algorithm>
#define nmax 17000
using namespace std;
struct date { int x,y,pos; };
int k,n,i,j,lp[16][nmax],aux,v[nmax],stp,sol;
char s[nmax];
date t[nmax];
bool cmp(const date &x,const date &y) { if (x.x==y.x) return (x.y<y.y); else return (x.x<y.x); }
inline int max(int a,int b) { if (a>b) return a; else return b; }
int lcp(int x,int y)
{
    int sol=0,i;
    if (x==y) return (n-x+1);
    for (i=stp;i>=0 && x<=n && y<=n;i--)
    if (lp[i][x]==lp[i][y]) {
        sol=sol+(1<<i); x=x+(1<<i); y=y+(1<<i);
    }
    return sol;
}
int main() {
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d %d",&n,&k); gets(s); gets(s+1);
for (i=1;i<=n;i++) lp[0][i]=s[i];
for (i=1;1<<(i-1)<=n;i++) {
    aux=1<<(i-1);
    for (j=1;j<=n;j++) {
        t[j].x=lp[i-1][j];
        if (j+aux<=n) t[j].y=lp[i-1][j+aux]; else t[j].y=-1;
        t[j].pos=j;
    }
    sort(t+1,t+n+1,cmp);
    for (j=1;j<=n;j++)
        if (j>1 && t[j].x==t[j-1].x && t[j].y==t[j-1].y) lp[i][t[j].pos]=lp[i][t[j-1].pos]; else
        lp[i][t[j].pos]=j;
}
stp=i-1;
for (i=1;i<=n;i++) v[lp[stp][i]]=i;
for (i=1;i+k-1<=n;i++) sol=max(sol,lcp(v[i],v[i+k-1]));
printf("%d",sol);
return 0;
}