Cod sursa(job #1558664)

Utilizator geniucosOncescu Costin geniucos Data 29 decembrie 2015 14:35:31
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

int ans, N, K, order[17009];
char sir[17009];

class SuffixArrays
{
public:
    int N;

    void fix_val (int pos, int val)
    {
        dp[0][pos] = val;
        a[pos].second = pos;
    }

    void RunIt (int order[])
    {
        for (int i=0; (1<<i) <= N; i++)
            maxlg = i;
        for (int i=1; i<=maxlg; i++)
        {
            int L = (1 << (i - 1));
            for (int j=1; j<=N; j++)
            {
                int P = a[j].second;
                a[j].first.first = dp[i - 1][P];
                if (P + L <= N) a[j].first.second = dp[i - 1][P + L];
                else a[j].first.second = 0;
            }
            sort (a + 1, a + N + 1);
            int curr = 0;
            for (int j=1; j<=N; j++)
            {
                if (j == 1 || a[j].first != a[j - 1].first) curr ++;
                dp[i][a[j].second] = curr;
            }
        }
        for (int i=1; i<=N; i++)
            order[i] = a[i].second;
    }

    int LCP (int x, int y)
    {
        if (x == y) return N - x + 1;
        int ans = 0;
        for (int i=maxlg; i>=0; i--)
            if (x + (1 << i) - 1 <= N && y + (1 << i) - 1 <= N && dp[i][x] == dp[i][y])
                x += 1 << i, y += 1 << i, ans += 1 << i;
        return ans;
    }
private:
    int maxlg, dp[16][17009];
    pair < pair < int, int > , int > a[17009];
}sa;

int main ()
{
freopen ("substr.in", "r", stdin);
freopen ("substr.out", "w", stdout);

scanf ("%d %d\n", &N, &K), sa.N = N;
gets (sir + 1);
for (int i=1; i<=N; i++)
    sa.fix_val (i, sir[i]);
sa.RunIt (order);
for (int i=1; i <= N - K + 1; i++)
{
    int curr = sa.LCP (order[i], order[i + K - 1]);
    if (curr > ans) ans = curr;
}
printf ("%d\n", ans);
return 0;
}