Cod sursa(job #2385383)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 21 martie 2019 21:05:36
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>
#define BIT(x) (1<<(x))

using namespace std;

struct rec
{
    int a, b, c;

    bool operator<(const rec& r) const
    {
        if(a != r.a)
            return a < r.a;
        if(b != r.b)
            return b < r.b;
        return c < r.c;
    }
};

int n, k;
char s[33000];
int mat[17000][16];
rec v[17000];

int main()
{
    //freopen("in.in", "r", stdin);
    freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);
    scanf("%d%d%s", &n, &k, s);
    if(k == 1)
    {
        printf("%d", n);
        return 0;
    }
    for(int i = 0; i < n; i++)
    {
        v[i].a = s[i];
        v[i].b = 0;
        v[i].c = i;
    }
    sort(v, v + n);
    int ind = 0;
    rec c = v[0];
    for(int i = 0; i < n; i++)
    {
        if(c.a != v[i].a || c.b != v[i].b)
            ind++;
        mat[v[i].c][0] = ind;
        c = v[i];
    }
    int p;
    for(p = 1; BIT(p - 1) <= n; p++)
    {
        for(int i = 0; i < n; i++)
        {
            v[i].a = mat[i][p - 1];
            if(i + BIT(p - 1) >= n)
                v[i].b = -1;
            else v[i].b = mat[i + BIT(p - 1)][p - 1];
            v[i].c = i;
        }
        sort(v, v + n);
        int ind = 0;
        rec c = v[0];
        for(int i = 0; i < n; i++)
        {
            if(c.a != v[i].a || c.b != v[i].b)
                ind++;
            mat[v[i].c][p] = ind;
            c = v[i];
        }
    }
    p--;

    int rez = 0;
    for(int i = 0; i < n - k + 1; i++)
    {
        int x = v[i].c;
        int y = v[i + k - 1].c;
        int lg = p;
        int r = 0;

        while(lg >= 0)
        {
            if(mat[x][lg] == mat[y][lg])
            {
                r += BIT(lg);
                x += BIT(lg);
                y += BIT(lg);
                if(x >= n || y >= n)
                    break;
            }
            lg--;
        }
        rez = max(rez, r);
    }
    printf("%d", rez);
    return 0;
}