Cod sursa(job #1070558)

Utilizator Teodor94Teodor Plop Teodor94 Data 1 ianuarie 2014 15:48:11
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.35 kb
#include <cstdio>
#include <tr1/unordered_map>
#include <algorithm>

using namespace std;
using namespace std::tr1;

#define MAX_N 16500
#define BASE 123

char s[MAX_N];
unordered_map< int, int > h;

void read( FILE *fin, int &n, int &k ) {
    fscanf( fin, "%d%d\n", &n, &k );
    fgets( s, MAX_N, fin );
}

int check( int len, int n ) {
    // bulaneala cu hashuri
    int number = 0, power = 1;
    for ( int i = 0; i < len; ++i )
        number = number * BASE + (int) s[i];
    for ( int i = 1; i < len; ++i )
        power *= BASE;

    h[number] = 1;

    for ( int i = len; i < n; ++i ) {
        number -= s[i - len] * power;
        number = number * BASE + (int) s[i];

        ++h[number];
    }

    int ans = 0;
    for ( unordered_map< int, int >::iterator it = h.begin(); it != h.end(); ++it )
        ans = max( ans, it->second );

    h.clear();

    return ans;
}

int binary_search( int n, int k ) {
    int i, pas = 1 << 14;
    for ( i = 0; pas; pas >>= 1 )
        if ( i + pas <= n && check( i + pas, n ) >= k )
            i += pas;
    return i;
}

int main() {
    FILE *fin, *fout;

    fin = fopen( "substr.in", "r" );
    int n, k;
    read( fin, n, k );
    fclose( fin );

    fout = fopen( "substr.out", "w" );
    fprintf( fout, "%d\n", binary_search( n, k ) );
    fclose( fout );
}