Mai intai trebuie sa te autentifici.

Cod sursa(job #1583472)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 28 ianuarie 2016 23:37:39
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <algorithm>
#include <unordered_map>

const int P1 = 23;
const int P2 = 29;
const int M1 = 100007;
const int M2 = 100023;
const int DIM = 1 << 15;
using namespace std;

char S[DIM]; int N, K, left, right, middle;
unordered_multimap <pair <int, int> > my_set;

int solve( int L ) {
    my_set.clear();
    int V1 = 0, V2 = 0, H1 = 1, H2 = 1;

    for( int i = 0; i < L; i ++ ) {
        V1 = (V1 * P1 + S[i]) % M1;
        V2 = (V2 * P2 + S[i]) % M2;

        if( i ) {
            H1 = (H1 * P1) % M1;
            H2 = (H2 * P2) % M2;
        }
    }

    my_set.insert( make_pair( V1, V2 ));

    for( int i = L; i < N; i ++ ) {
        V1 = ((V1 - (S[i - L] * H1) % M1 + M1) * P1 + S[i]) % M1;
        V2 = ((V2 - (S[i - L] * H2) % M2 + M2) * P2 + S[i]) % M2;

        my_set.insert( make_pair( V1, V2 ));

        if( my_set.count( make_pair( V1, V2 )) >= K )
            return 1;
    }

    return 0;
}

int main () {

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

    scanf( "%d %d %s", &N, &K, S );

    if( K == 1 ) {
        printf( "%d\n", N );
        return 0;
    }

    left = 1; right = N;
    while( left <= right ) {
        middle = left + (right - left) / 2;

        if( solve( middle ))
            left  = middle + 1;
        else
            right = middle - 1;
    }

    printf( "%d\n", right );

    return 0;
}