Cod sursa(job #2795712)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 6 noiembrie 2021 20:19:12
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#pragma GCC optimize("O3")
#include <unordered_map>
#include <fstream>
#include <stdio.h>
///#include <string>

#define MOD 1000000009
#define BASE 67

inline int val( char c ) {
    if( 'a' <= c && c <= 'z' )
        return ( c - 'a' );
    else if( 'A' <= c && c <= 'Z' )
        return ( c - 'A' + 27 );
    return ( c - '0' + 54 );
}

#define MAX 17000

int n, k, res, curr, st, dr;
std::unordered_map<int, int> m;
int hash[ MAX ];
long long cop;
int v[ MAX ];
std::string s;

inline bool ok( int l ) {
    m.clear(); // nu pot sa il pun la sfarsit :///
    for( int i = 0; i <= n - l; ++i ) {
        cop = ( long long )( hash[ i + l ] + MOD - hash[ i ] ) * v[ n - i - 1 ];
        curr = cop % MOD;
        ++m[ curr ];
    }

    for( const auto& x : m )
        if( x.second >= k )
            return true;
    return false;
}

int main()
{
    std::ifstream fin( "substr.in" );
    fin >> n >> k >> s;
    fin.close();

    v[ 0 ] = 1;
    for( int i = 1; i <= n; ++i ) {
        cop = ( long long )v[ i - 1 ] * BASE;
        v[ i ] = cop % MOD;
    }

    for( int i = 0; i < n; ++i ) {
        cop = hash[ i ] + ( long long )val( s[ i ] ) * v[ i ];
        hash[ i + 1 ] = cop % MOD;
    }

    st = 0, dr = n;
    while( st <= dr ) {
        int med = ( st + dr ) / 2;
        if( ok( med ) ) {
            res = med;
            st = med + 1;
        } else dr = med - 1;
    }

    std::ofstream fout( "substr.out" );
    fout << res << '\n';
    fout.close();
    return 0;
}