Cod sursa(job #2557030)

Utilizator Alex_AeleneiAlex Aelenei Ioan Alex_Aelenei Data 25 februarie 2020 14:10:50
Problema Substr Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <map>
#include <fstream>
#include <iostream>

using namespace std;

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

const int MOD1 = 1e9 + 7 ;
const int MOD2 = 1e9 + 9 ;
const int BASE = 91 ;
map < pair < int , int > , int > strs ;
string s ;
int k ;

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

    strs.clear () ;

    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 ;
        }
    }

    ++ strs [ make_pair ( h1 , h2 ) ] ;

    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 ;

        ++ strs [ make_pair ( h1 , h2 ) ] ;
    }

    map < pair < int , int > , int > :: iterator it ;

    /*out << val << '\n' ;
    for ( it = strs.begin () ; it != strs.end () ; ++ it )
        out << ( it -> first ).first << ' ' << ( it -> first ).second << ':' << ( it -> second ) << '\n' ;
    out << '\n' ;*/

    for ( it = strs.begin () ; it != strs.end () ; ++ it )
        if ( ( it -> second ) >= k )
            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;
}