Cod sursa(job #2557062)

Utilizator Alex_AeleneiAlex Aelenei Ioan Alex_Aelenei Data 25 februarie 2020 14:38:02
Problema Substr Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <iostream>
#include <algorithm>

using namespace std;

ifstream in ( "substr.in" ) ;
ofstream out ( "substr.out" ) ;

const int NMAX = 1 << 16 ;
const int MOD1 = 1e9 + 7 ;
const int MOD2 = 1e9 + 9 ;
const int BASE = 91 ;
int v [ NMAX + 5 ] ;
string s ;
int k ;

inline int ok ( int val )
{
    long long i , h1 = 0 , h2 = 0 , p1 , p2 , l = 0 ;

    p1 = 1 ; ///p2 = 1 ;
    for ( i = 0 ; i < val ; ++ i )
    {
        h1 = ( h1 * BASE + s [ i ] ) % MOD1 ;
        ///h2 = ( h2 * BASE + s [ i ] ) % MOD2 ;

        if ( i != val - 1 )
        {
            p1 = ( p1 * BASE ) % MOD1 ;
            ///p2 = ( p2 * BASE ) % MOD2 ;
        }
    }

    v [ 0 ] = h1 ;

    for ( i = val ; i < s.size () ; ++ i )
    {
        h1 = ( ( ( h1 - ( s [ i - val ] * p1 ) % MOD1 + MOD1 ) % MOD1 ) * BASE + s [ i ] )  % MOD1 ;
        ///h2 = ( ( ( h2 - ( s [ i - val ] * p2 ) % MOD2 + MOD2 ) % MOD2 ) * BASE + s [ i ] )  % MOD2 ;

        v [ i - val + 1 ] = h1 ;
    }

    sort ( v , v + s.size () - val + 1 ) ; l = 1 ;

    for ( i = 1 ; i < s.size () - val + 1 ; ++ i )
        if ( v [ i ] == v [ i - 1 ] )
            ++ l ;
        else
        {
            if ( l >= k )
                return 1 ;
            l = 1 ;
        }

    if ( l >= val )
        return 1 ;
    return 0 ;
}

int main()
{
    int n , st , dr , med , last = 0 , val ;

    in >> n >> k >> s ;

    st = 0 ; dr = n ;

    while ( st <= dr )
    {
        med = ( st + dr ) >> 1 ;

        val = ok ( med ) ;

        if ( val )
            st = med + 1 , last = med ;
        else
            dr = med - 1 ;
    }

    out << last ;

    return 0;
}