Cod sursa(job #1517380)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 4 noiembrie 2015 10:20:44
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <cstdio>
#include <algorithm>

#define LIM 30407
#define log2 17

using namespace std;
int n, k;
char s[LIM];
int suffix[log2][LIM], Log;
struct dinamica
{
    int st;
    int dr;
    int pos;
} v[LIM];
bool cmp(const dinamica &a, const dinamica &b)
{
    if(a.st != b.st) return (a.st < b.st);
    return (a.dr < b.dr);
}

inline void string_convert()
{
    for(int i = 1; i<= n; ++i)
    {
        if(s[i] >= 'a' && s[i] <= 'z') {s[i] = s[i] - 'a' + 1;continue;}
        if(s[i] >= 'A' && s[i] <= 'Z') {s[i] = s[i] - 'A' + 30;continue;}
        if(s[i] >= '0' && s[i] <= '9') {s[i] = s[i] - '0' + 60;continue;}
        s[i] = -1;
    }
}
inline void construct_suffix_array()
{
    for(int i = 1; i<= n; ++i) suffix[0][i] = s[i];
    for(int pas = 1; (1<<(pas-1)) < n; ++pas)
    {
        for(int i = 1; i<= n; ++i)
        {
            v[i].st = suffix[pas-1][i];
            v[i].dr = suffix[pas-1][i + (1<<(pas-1))];
            v[i].pos = i;
        }
        sort(v+1, v+n+1, cmp);
        suffix[pas][v[1].pos] = 1;
        for(int i = 2; i <= n; ++i)
        {
            if(v[i].st == v[i-1].st && v[i].dr == v[i-1].dr) suffix[pas][v[i].pos] = suffix[pas][v[i-1].pos];
            else suffix[pas][v[i].pos] = i;
        }
        Log = (pas-1);
    }
}
inline void build_solution()
{
    int first, last, step, it, sze, sol = 0;
    for(int i = n - k + 1; i; --i)
    {
        first = v[i].pos;
        last = v[i+k-1].pos;
        step = (1<<Log);
        it = Log;
        sze = 0;
        for(; step; step>>=1, --it)
        {
            if(first+step-1<=n && last+step-1<=n)
            {
                if(suffix[it][first] == suffix[it][last])
                {
                    first += step;
                    last += step;
                    sze += step;
                }
            }
        }
        sol = max(sze, sol);
    }
    printf("%d\n", sol);
}

int main()
{
    freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);
    scanf("%d %d", &n, &k);
    scanf("%s", s+1);
    string_convert();
    construct_suffix_array();
    build_solution();
    return 0;
}