Cod sursa(job #2559145)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 27 februarie 2020 08:17:19
Problema Substr Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <vector>
#include <algorithm>

#define N 16385
#define b1 27
#define b2 28
#define mod1 1000007
#define mod2 666013

using namespace std;

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

vector < pair < int, int > > h;
char S[N];
int n, k;

bool cmp ( pair < int, int > &a, pair < int, int > &b ){
    if ( a.first == b.first )
        return a.second > b.second;
    return a.first > b.first;
}

bool verif ( int x ){
    int x1 = 0, x2 = 0, p1 = 1, p2 = 1;
    for ( int i = 1; i < x; i++ ){
        p1 *= b1;
        p2 *= b2;
    }
    for ( int i = 1; i <= n; i++ ){
        if ( i > x ){
            x1 -= ( S[i - x] - 'a' ) * p1;
            x2 -= ( S[i - x] - 'a' + 1 ) * p2;
        }
        x1 = x1 * b1 + ( S[i] - 'a' );
        x2 = x2 * b2 + ( S[i] - 'a' + 1 );
        if ( i >= x )
            h.push_back ( { x1 % mod1, x2 % mod2 } );
    }
    sort ( h.begin ( ), h.end ( ), cmp );
    int nr = 1;
    bool ok = 0;
    for ( int i = 1; i <= n && ok == 0; i++ ){
        if ( h[i] == h[i - 1] ){
            nr++;
            if ( nr >= k )
                ok = 1;
        }
        else
            nr = 1;
    }
    h.clear ( );
    return ok;
}

int main()
{   int st, dr, sol;
    f >> n >> k;
    f >> ( S + 1 );
    st = 1, dr = n / 3;
    while ( st <= dr ){
        int mid = ( st + dr ) / 2;
        if ( verif ( mid ) == 1 ){
            sol = mid;
            st = mid + 1;
        }
        else
            dr = mid - 1;
    }
    g << sol;
    return 0;
}