Cod sursa(job #1022653)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 5 noiembrie 2013 20:29:52
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<fstream>
#include<algorithm>
#define N 17000
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int i,n,j,k,l,sol,put,p[20][N],poz[N];
char s[N];
struct triplet{int a,b,poz;}v[N];
inline bool cmp1(int a,int b)
{
    return p[l][a]<p[l][b];
}
inline bool cmp(triplet a,triplet b)
{
    if(a.a==b.a)
    return a.b<b.b;
    return a.a<b.a;
}
inline int lcp(int x,int y)
{
    if(x==y)
    return n-x;
    int k=l,rez=0;
    while(k>=0&&x<n&&y<n)
    {
        if(p[k][x]==p[k][y])
        {
            rez+=(1<<k);
            x+=(1<<k);
            y+=(1<<k);
        }
        --k;
    }
    return rez;
}
int main()
{
    f>>n>>k;
    f.get();
    f>>s;
    for(i=0;i<n;++i)
    p[0][i]=s[i]-'a';
    for(l=1,put=1;(put>>1)<n;++l,put<<=1)
    {
        for(i=0;i<n;++i)
        {
            v[i].a=p[l-1][i];
            v[i].b=-1;
            if(i+put<n)
            v[i].b=p[l-1][i+put];
            v[i].poz=i;
        }
        sort(v,v+n,cmp);
        for(i=0;i<n;++i)
        {
            p[l][v[i].poz]=i;
            if(i>0&&v[i-1].a==v[i].a&&v[i-1].b==v[i].b)
            p[l][v[i].poz]=p[l][v[i-1].poz];
        }
    }
    --l;
    for(i=0;i<n;++i)
    poz[i]=i;
    sort(poz,poz+n,cmp1);
    for(i=k-1,j=0;i<n;++i,++j)
    sol=max(sol,lcp(poz[i],poz[j]));
    g<<sol<<'\n';
    return 0;
}