Cod sursa(job #1338973)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 10 februarie 2015 16:20:41
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>

using namespace std;

int line;
char s[111111];
int n,a[22][111111],x[111111];


int lcp(int x, int y)
{
    int i,pas=16;
    for(i=0;pas>=0;pas--)
    {
        if((1<<pas)>=n)
            continue;
        if(a[pas][x]==a[pas][y])
        {
            x+=(1<<pas);
            y+=(1<<pas);
            i+=(1<<pas);
            if(x>=n || y>=n)
                return i;
        }
    }
    return i;
}

bool cmp(int x, int y)
{
    //cout<<y<<" "<<x<<"\n";
    if(a[line-1][x]<a[line-1][y])
        return true;
    if(a[line-1][x]>a[line-1][y])
        return false;
    if(y+(1<<(line-1))>=n)
        return false;
    if(x+(1<<(line-1))>=n)
        return true;
    return a[line-1][x+(1<<(line-1))]<a[line-1][y+(1<<(line-1))];
}


int main()
{
    int i,j,put,k;
    ifstream in("substr.in");
    ofstream out("substr.out");
    in>>n>>k;
    if(k==1)
    {
        out<<n;
        return 0;
    }
    in.getline(s,11);
    in.getline(s,111111);
    n=strlen(s);

    for(i=0;i<n;++i)
    {
        a[0][i]=s[i];
    }
    for(i=1;(1<<i)<=2*n;++i)
    {
        for(j=0;j<n;++j)
        {
            x[j]=j;
        }
        line=i;
        sort(x,x+n,cmp);
        a[line][x[0]]=1;
        for(j=1;j<n;++j)
        {
            if(cmp(x[j-1],x[j])==false)
                a[line][x[j]]=a[line][x[j-1]];
            else
                a[line][x[j]]=a[line][x[j-1]]+1;
        }
    }
    //linie=i-1
    int p, maxim=0;
    --k;
    for(i=k;i<n;++i)
    {
        p=lcp(x[i],x[i-k]);
        if(p>maxim)
            maxim=p;
        cout<<p<<" ";
    }
    out<<maxim<<"\n";
    return 0;
}