Cod sursa(job #756895)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 10 iunie 2012 17:33:46
Problema Substr Scor 50
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.76 kb
#include <cstdio>
#include <map>
#include <algorithm>

#define D 62
#define NMax 17000

using namespace std;

const int U[2]={666013, 1000003};
map < pair <int, int>, int > H;
int N, K, P[2][NMax], S[NMax], CurrentK, Solution;

void ComputeP ()
{
    P[0][0]=P[1][0]=1;
    for (int i=1; i<=N; ++i)
    {
        for (int j=0; j<2; ++j) P[j][i]=(D*P[j][i-1])%U[j];
    }
}

inline void Insert (int HV[2])
{
    if (H.find (make_pair (HV[0], HV[1]))!=H.end ())
    {
        ++H[make_pair (HV[0], HV[1])];
    }
    else H[make_pair (HV[0], HV[1])]=1;
    CurrentK=max (CurrentK, H[make_pair (HV[0], HV[1])]);
}

inline int Count (int L)
{
    CurrentK=0;
    int HV[2]={0, 0};
    for (int i=0; i<L; ++i)
    {
        for (int j=0; j<2; ++j) HV[j]=(HV[j]*D+S[i])%U[j];
    }
    Insert (HV);
    for (int i=L; i<N; ++i)
    {
        for (int j=0; j<2; ++j)
        {
            HV[j]=((HV[j]-(P[j][L-1]*S[i-L])%U[j]+U[j])*D+S[i])%U[j];
        }
        Insert (HV);
    }
    H.clear ();
    return CurrentK;
}

void BSearch ()
{
    int L=0, R=N;
    while (L<=R)
    {
        int Mid=(L+R)/2;
        if (Count (Mid)>=K) Solution=Mid, L=Mid+1;
        else R=Mid-1;
    }
}

void Solve ()
{
    ComputeP ();
    BSearch ();
}

inline int Convert (char X)
{
    if (X<='9') return X-'0';
    if (X<='Z') return X-'A'+10;
    if (X<='z') return X-'a'+36;
}

void Read ()
{
    freopen ("substr.in", "r", stdin);
    scanf ("%d %d\n", &N, &K);
    for (int i=0; i<N; ++i)
    {
        char C; scanf ("%c", &C); S[i]=Convert (C);
    }
}

void Print ()
{
    freopen ("substr.out", "w", stdout);
    printf ("%d\n", Solution);
}

int main ()
{
    Read ();
    Solve ();
    Print ();
    return 0;
}