Cod sursa(job #1403362)

Utilizator danalex97Dan H Alexandru danalex97 Data 27 martie 2015 11:17:53
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;

ifstream F("substr.in");
ofstream G("substr.out");

const int N = 20010;
const int L = 16;

int n,k,l,dp[L][N];
char c[N];

struct tup {
    int x,y,p;
};

bool cmp(tup a,tup b)
{
    return a.x == b.x ? a.y < b.y : a.x < b.x;
}

bool cmp2(int a,int b)
{
    return dp[l][a] < dp[l][b];
}

tup a[N];

void compute()
{
    for (int i=1;i<=n;++i)
        dp[0][i] = c[i] - 'a';
    l = 1;
    for (int ln=1;ln<=n;ln*=2,++l)
    {
        for (int i=1;i<=n;++i)
        {
            a[i].p = i;
            a[i].x = dp[l-1][i];
            a[i].y = i+ln >= n ? 0 : dp[l-1][i+ln];
        }
        sort(a+1,a+n+1,cmp);
        int vl = -1;
        a[0].x = -100000;
        for (int i=1;i<=n;++i)
        {
            if ( a[i].x != a[i-1].x || a[i].y != a[i-1].y ) ++vl;
            dp[l][a[i].p] = vl;
        }
    }
    --l;
}

void print()
{
    for (int i=1;i<=n;++i)
        cerr<<c[i]<<' ';
    cerr<<'\n';
    for (int i=0;i<=l;++i)
    {
        for (int j=1;j<=n;++j)
            cerr<<dp[i][j]<<' ';
        cerr<<'\n';
    }
}

int lcp(int x,int y)
{
    int ans = 0;
    for (int i=l;i>=0;--i)
    {
        if ( x + (1<<i) - 1 > n ) continue;
        if ( y + (1<<i) - 1 > n ) continue;
        if ( dp[i][x] == dp[i][y] )
        {
            ans += (1<<i);
            x += (1<<i);
            y += (1<<i);
        }
    }
    return ans;
}

int p[N];

int main()
{
    F>>n>>k;
    F>>(c+1);

    compute();
    //print();
    for (int i=1;i<=n;++i)
        p[i] = i;
    sort(p+1,p+n+1,cmp2);

    int ans = 0;
    for (int i=1,j=k;j<=n;++i,++j)
        ans = max(ans,lcp(p[i],p[j]));
    G<<ans<<'\n';
}