Cod sursa(job #1254591)

Utilizator george_stelianChichirim George george_stelian Data 2 noiembrie 2014 23:06:43
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct suffix
{
    int s1,s2,poz;
    bool operator <(const suffix &aux) const
    {
        if(s1==aux.s1) return s2<aux.s2;
        else return s1<aux.s1;
    }
    bool operator ==(const suffix &aux) const
    {
        return s1==aux.s1 && s2==aux.s2;
    }
}s[16400];
int p[16][16400],n,logn;
pair<int,int> v[16400];
char sir[16400];

int LCP(int x,int y)
{
    if(x==y) return n-x;
    int rez=0;
    for(int i=logn;i>=0 && x<n && y<n;i--)
        if(p[i][x]==p[i][y]) {rez+=1<<i;x+=1<<i;y+=1<<i;}
    return rez;
}

int main()
{
    freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);
    int m;
    scanf("%d%d\n%s",&n,&m,sir);
    for(logn=1;1<<logn<n;logn++);
    for(int i=0;i<n;i++) {p[0][i]=sir[i];s[i].poz=i;}
    for(int i=1;i<=logn;i++)
    {
        for(int j=0;j<n;j++)
        {
            s[j].s1=p[i-1][s[j].poz];
            if(s[j].poz+(1<<(i-1))<n) s[j].s2=p[i-1][s[j].poz+(1<<(i-1))];
            else s[j].s2=-1;
        }
        sort(s,s+n);
        for(int j=0;j<n;j++)
            if(j>0 && s[j]==s[j-1]) p[i][s[j].poz]=p[i][s[j-1].poz];
            else p[i][s[j].poz]=j;
    }
    int sol=0;
    for(int i=0;i<=n-m;i++) sol=max(sol,LCP(s[i].poz,s[i+m-1].poz));
    printf("%d",sol);
    return 0;
}