Cod sursa(job #2559144)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 27 februarie 2020 08:15:20
Problema Substr Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 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" );

struct entry{
    int val1, val2;
};
vector < entry > h;
char S[N];
int n, k;

bool cmp ( entry &a, entry &b ){
    if ( a.val1 == b.val1 )
        return a.val2 > b.val2;
    return a.val1 > b.val1;
}

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].val1 == h[i - 1].val1 && h[i].val2 == h[i].val2 ){
            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;
}