Cod sursa(job #1254580)

Utilizator george_stelianChichirim George george_stelian Data 2 noiembrie 2014 22:50:36
Problema Substr Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 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)
{
    int rez=0;
    for(int i=logn-1;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;
    }
    if(m==1) {printf("%d",n);return 0;}
    int x=1,y=0,sol=0;
    for(int i=1;i<n;i++)
    {
        int a=LCP(s[i].poz,s[i-1].poz);
        while(x<=y && a<v[y].first) y--;
        v[++y]=make_pair(a,i);
        if(v[x].second<=i-m+1) x++;
        sol=max(sol,v[x].first);
    }
    printf("%d",sol);
    return 0;
}