Cod sursa(job #2559156)

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

#define N 16385
#define u unsigned int
#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 < u , u > > h;
char S[N];
int n, k;
u p1[N], p2[N];

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

bool verif ( int x ){
    u x1 = 0, x2 = 0;
    for ( int i = 1; i <= n; i++ ){
        if ( i > x ){
            x1 -= ( S[i - x] - 'a' ) * p1[x - 1];
            x2 -= ( S[i - x] - 'a' + 1 ) * p2[x - 1];
        }
        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 < h.size ( ); i++ ){
        if ( h[i] == h[i - 1] ){
            nr++;
            if ( nr >= k ){
                ok = 1;
                break;
            }
        }
        else
            nr = 1;
    }
    h.clear ( );
    return ok;
}

int main()
{   int st, dr, sol, i;
    f >> n >> k;
    f >> ( S + 1 );
    p1[0] = p2[0] = 1;
    for ( i = 1; i < n; i++ ){
        p1[i] = p1[i - 1] * b1;
        p2[i] = p2[i - 1] * b2;
    }
    st = 1, dr = n;
    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;
}