Cod sursa(job #2040361)

Utilizator andru47Stefanescu Andru andru47 Data 15 octombrie 2017 18:28:40
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
int dp[20][16386],n,k;
pair <pair <int , int> , int> s[16386];
char ss[16386];
inline int lcp(int p1, int p2)
{
    if (p1 == p2)
        return n - p1 + 1;
    int logg = 0;
    for (; (1 << logg) <= n ; ++logg);
    --logg;
    int lung = 0;
    for (int i = logg; i>=0; --i)
        if (dp[i][p1] == dp[i][p2])
            p1 += (1 << i) , p2 += (1 << i), lung += (1 << i);
    return lung;
}
int main()
{
    freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);

    scanf("%d %d\n", &n, &k);

    gets(ss + 1);

    for (int i = 1; i<=n; ++i)
        dp[0][i] = ss[i] - '0';
    for (int i = 1; (1 << i) <=n ; ++i)
    {
        for (int j = 1; j<=n; ++j)
        {
            s[j].first.first = dp[i - 1][j];
            if (j + (1 << (i - 1)) <= n)
                s[j].first.second = dp[i-1][j + (1 << (i - 1))];
            else s[j].first.second = -1;
            s[j].second = j;
        }
        sort(s + 1, s + n + 1);
        int last = 0;
        for (int j = 1; j<=n; ++j)
            if (s[j].first != s[j - 1].first)
                dp[i][s[j].second] = ++last;
            else dp[i][s[j].second] = last;
    }
    int ans = 0;
    for (int i = 1; i <= n - k + 1; ++i)
        ans = max(ans , lcp(s[i].second , s[i + k - 1].second));
    printf("%d\n", ans);
    return 0;
}